2012-02-24 19 views
0

非オブジェクトにメンバ関数の呼び出し:PHP OOP:私は次のコードでユーザークラスを作成している

<?php 
    require_once("database.php"); 
    class User { 
     public $id; 
     public $username; 
     public $password; 
     public $first_name; 
     public $last_name; 

     public static function find_all() { 
      return self::find_by_sql("select * from users"); 
     } 
     public static function find_by_id($id=0) { 
      global $database; 
      $result_array=self::find_by_sql("Select * from users where id={$id} limit 1"); 
      if (!empty($result_array)) { 
       return array_shift($result_array); 
      } else { 
       return FALSE; 
      } 
     } 
     public function find_by_sql($sql="") { 
      global $database; 
      $result_set=$database->query($sql); 
      $object_array=array(); 
      while ($row=$database->fetch_array($result_set)) { 
       $object_array[]=self::instantiate($row); 
      } 
       return $object_array; 
     } 
     public function full_name() { 
      if (isset($this->first_name)&& isset($this->last_name)) { 
     return $this->first_name." ".$this->lastname; 
      } else { 
       return ""; 
      } 
     } 
     private static function instantiate($record) { 
      $object=new self; 
      $object->id=$record['id']; 
      $object->username=$record['username']; 
      $object->password=$record['password']; 
      $object->first_name=$record['first_name']; 
      $object->last_name=$record['last_name']; 
      return $object; 
     } 
    } 
    ?> 

私はindex.phpの中で、次のコードを実行しようと

<?php 
$user=User::find_by_id(1); 
echo $user->full_name(); 
?> 

私は次のエラーを取得する:

(!) Fatal error: Call to a member function full_name() on a non-object in C:\wamp\www\imagepro\public\index.php on line 8 
Call Stack 
# Time Memory Function Location 
1 0.0010 669408 {main}() ..\index.php:0 

私は、オブジェクトがされていると思うので、私はこのエラーを取得していますなぜ私は理解していませんインスタンス化され、エラーは、私は非オブジェクトからオブジェクト関数を呼び出していると言います。

これはローカルホスト上で実行しているので、私のPHP設定に問題がありますか?誰も助けることができますか?

答えて

5

つまり、$userはオブジェクトではありません。 find_by_id()FALSE(オブジェクトではありません)を返すことができるので、私の推測は何が起きているのかということです。ID 1のユーザーはいないので、何も得られません(この場合はFALSE)、オブジェクトのプロパティはFALSE

これを解決するには、オブジェクトとして使用する前に何らかのチェック(is_object($user)または$user !== FALSE)を追加します。

1
if (!empty($result_array)) { 
       return array_shift($result_array); 
      } else { 
       return FALSE; 
      } 

$userが配列または偽のいずれかになりますことを意味します - これはすべてのオブジェクトではありません。

+0

私は同様ですが、OPがオブジェクトの配列を生成するために多くの静的関数を呼び出しているようで、戻り値がオブジェクトになる可能性があります。 – jeroen

関連する問題