16 个 PHP 开发者必知必会的魔术方法( 四 )

如果坚持使用对象作为方法 (但未定义__invoke () 方法),则将得到以下结果:
 
Fatal error: Function name must be a string in D:phpStudyWWWtestindex.php on line 1813.__set_state()从 PHP 5.1.0 开始,在调用 var_export () 导出类代码时会自动调用__set_state () 方法 。
__set_state () 方法的参数是一个包含所有属性值的数组,其格式为 array ('property'=> value,...)
在以下示例中,我们没有定义__set_state () 方法:
<?phpclass Person{public $sex;public $name;public $age;public function __construct($name="",$age=25, $sex='Male'){$this->name = $name;$this->age= $age;$this->sex= $sex;}}$person = new Person('John'); // Initially assigned.var_export($person);执行代码结果如下:
Person::__set_state(array( 'sex' => 'Male', 'name' => 'John', 'age' => 25, ))显然,对象的属性已打印 。
 
现在让我们看看定义__set_state () 方法的另一种情况:
<?phpclass Person{public $sex;public $name;public $age;public function __construct($name="",$age=25, $sex='Male'){$this->name = $name;$this->age= $age;$this->sex= $sex;}public static function __set_state($an_array){$a = new Person();$a->name = $an_array['name'];return $a;}}$person = new Person('John'); // Initially assigned.$person->name = 'Jams';var_export($person);执行代码结果如下:
 
Person::__set_state(array( 'sex' => 'Male', 'name' => 'Jams', 'age' => 25, ))14. __clone()在 PHP 中,我们可以使用 clone 关键字通过以下语法克隆对象:
$copy_of_object = clone $object;但是,使用 clone 关键字只是一个浅拷贝,因为所有引用的属性仍将指向原始变量 。
如果在对象中定义了 clone () 方法,则将在复制生成的对象中调用 clone () 方法,该方法可用于修改属性的值 (如有必要) 。
下面是相关的示例:
<?phpclass Person{public $sex;public $name;public $age;public function __construct($name="",$age=25, $sex='Male'){$this->name = $name;$this->age= $age;$this->sex= $sex;}public function __clone(){echo __METHOD__."your are cloning the object.<br>";}}$person = new Person('John'); // Initially assigned.$person2 = clone $person;var_dump('persion1:');var_dump($person);echo '<br>';var_dump('persion2:');var_dump($person2);运行代码结果如下:
 
Person::__clone your are cloning the object.string(9) "persion1:" object(Person)#1 (3) { ["sex"]=> string(3) "Male" ["name"]=> string(6) "John" ["age"]=> int(25) }string(9) "persion2:" object(Person)#2 (3) { ["sex"]=> string(3) "Male" ["name"]=> string(6) "John" ["age"]=> int(25) }15.__autoload()__autoload () 方法可以尝试加载未定义的类 。
 
过去,如果要在程序文件中创建 100 个对象,则必须使用 include () 或 require () 来包含 100 个类文件,或者必须在同一类文件中定义 100 个类 。例如以下:
 
/** * file non_autoload.php */require_once('project/class/A.php');require_once('project/class/B.php');require_once('project/class/C.php');...if (ConditionA) {$a = new A();$b = new B();$c = new C();// …} else if (ConditionB) {$a = newA();$b = new B();// …}那么,如果我们使用__autoload () 方法呢?
 
/** * file autoload_demo.php */function__autoload($className) {$filePath = “project/class/{$className}.php”;if (is_readable($filePath)) {require($filePath);}}if (ConditionA) {$a = new A();$b = new B();$c = new C();// …} else if (ConditionB) {$a = newA();$b = new B();// …}当 PHP 引擎第一次使用类 A 时,如果未找到类 A,则 autoload 方法将被自动调用,并且类名称 “A” 将作为参数传递 。因此,我们在 autoload () 方法中需要做的是根据类名找到相应的类文件,然后将其包含在内 。如果找不到该文件,则 php 引擎将抛出异常 。
 
16. __debugInfo()当执行 var_dump() 方法时,__debugInfo() 方法会被自动调用 。如果 __debugInfo() 方法未被定义,那么 var_dump 方法或打印出这个对象的所有属性 。
 
举例说明:
<?phpclass C {private $prop;public function __construct($val) {$this->prop = $val;}/*** @return array*/public function __debugInfo() {return ['propSquared' => $this->prop ** 2,];}}var_dump(new C(42));


推荐阅读