php魔术办法简介
前面的话
php在面向对象部分有许多相关的魔术办法,这些办法为面向对象实现供给了便当,本文将具体介绍魔术办法
结构办法
大多数类都有一种称为结构函数的非凡办法。当创立一个对象时,它将主动调取结构函数,平常用它施行一些有用的初始化任务
结构函数的声明与其它操纵的声明一样,只是其名称必需是两个下划线__construct( )。这是PHP5中的转变;PHP4的版本中,结构函数的名称必需与类名雷同。为了向下兼容,假如一个类中没有名为__construct( )的办法,PHP将搜索一个与类名雷同的办法
void __construct ([ mixed $args [, $... ]] )
假如子类中定义了结构函数则不会隐式调取其父类的结构函数。要施行父类的结构函数,需要在子类的结构函数中调取 parent::__construct()
。假如子类没有定义结构函数则会犹如一个一般的类办法一样从父类继承(假设没有被定义为 private 的话)
<?phpclass BaseClass { function __construct() { print "In BaseClass constructor "; } }class SubClass extends BaseClass { function __construct() { parent::__construct(); print "In SubClass constructor "; } }
析构办法
与结构办法相对的就是析构办法。析构办法是PHP5新增加的内容,在PHP4中没有析构办法。析构办法是在对象被烧毁此前主动调取的办法,主要施行一些特定的操纵,例如关闭文件,开释结果集等
与结构办法相似,一个类的析构办法名称必需是两个下划线 __destruct( )。析构函数不克不及带有任何参数
<?phpclass MyDestructableClass { function __construct() { print "In constructor "; $this->name = "MyDestructableClass"; } function __destruct() { print "Destroying " . $this->name . " "; } }//In constructor Destroying MyDestructableClass$obj = new MyDestructableClass();?>
不成拜访属性
get()
读取不成拜访属性(protected、private)时,__get()会被调取,并将属性名以第一个参数(string)传进此办法中
public mixed __get ( string $name )
<?phpclass demo{ protected $protected = 1; public $public = 2; private $private = 3; function __get($name){ echo "111{$name}111<br>"; } }$d1 = new demo;$d1->protected;//111protected111$d1->public;$d1->private;//111private111?>
set()
在给不成拜访属性(protected、private)赋值时,__set() 会被调取,并将属性名以第一个参数(string),值作为第二参数(mixed)传进此办法中
public void __set ( string $name , mixed $value )
<?phpclass demo{ protected $protected = 1; public $public = 2; private $private = 3; function __set($name,$value){ echo "0{$name}0{$value}<br>"; } }
isset()
当对不成拜访属性(protected、private)调取 isset() 或 empty() 时,__isset() 会被调取
public bool __isset ( string $name )
<?phpclass demo{ protected $protected = 1; public $public = 2; private $private = 3; function __isset($name){ echo "0{$name}0<br>"; } }
unset()
当对不成拜访属性(protected、private)调取unset()时,__unset()会被调取
public void __unset ( string $name )
<?phpclass demo{ protected $protected = 1; public $public = 2; private $private = 3; function __unset($name){ echo "0{$name}0<br>"; } }
对象复制
clone()
在对象克隆时会主动调取clone()办法,这办法不需要任何参数,可以通过该办法对克隆后的副本从新初始化
clone()办法会主动包括this和that两个对象的援用,this是副本对象的援用,that是本来对象的援用
<?php class Person{ private $name; private $sex; private $age; function __construct($name="",$sex="",$age=1){ $this->name= $name; $this->sex = $sex; $this->age = $age; } function __clone(){ $this->name = $this->name."的副本"; } function say(){ echo "我的名字:" .$this->name.",性别:".$this->sex.",年龄:".$this->age."<br>"; } }
字符串
toString()
__toString()办法用于一个类被当做字符串时应怎样回应,它是快速猎取对象的字符串表示的最便利的方式,是直接输出对象援用时主动调取的办法
<?phpclass TestClass{
public $foo; public function __construct($foo)
{
$this->foo = $foo;
} public function __toString() {
return $this->foo;
}
}$class = new TestClass('Hello');echo $class;//Hello?>
对象不存在
call()
在对象中调取一个不成拜访办法时,__call()会被调取
callStatic()
在静态上下文中调取一个不成拜访办法时,__callStatic()会被调取
<?phpclass MethodTest { public function __call($name, $arguments) { echo "Calling object method '$name' " . implode(', ', $arguments). " "; } public static function __callStatic($name, $arguments) { echo "Calling static method '$name' " . implode(', ', $arguments). " "; } }
主动加载类
autoload()
在PHP5中,可以定义一个__autoload()函数,它会在试图使用尚未被定义的类时主动调取。通过调取此函数,足本引擎在PHP出错失败前有了最后一个时机加载所需的类
<?phpfunction __autoload($class_name) { require_once $class_name . '.php'; }
串行化
sleep()
在调取serialize()函数将对象串行化时,检查类中可否存在一个魔术办法 __sleep()。假如存在,该办法会先被调取,然后才施行序列化操纵。此功效可以用于清算对象,并返回一个包括对象中所有应被序列化的变量名称的数组。假如该办法未返回任何内容,则 NULL 被序列化,并发生一个 E_NOTICE 级别的错误
__sleep()函数不需要接受任何参数,但需要返回一个数组,在数组中包括需要串行化的属性。未被包括在数组中的属性将在串行化时被忽略。假如没有在类中声明__sleep()办法,对象中的所有属性都将被串行化
wakeup()
在调取unserialize()函数将对象反串行化对象时,则会主动调取对象中的__wakeup()办法,用来在二进制串从新组成一个对象时,为新对象中的成员属性从新初始化
wakeup()经常用在反序列化操纵中,例如从新创立数据库连接,或施行其它初始化操纵
<?phpclass Connection { protected $link; private $server, $username, $password, $db; public function __construct($server, $username, $password, $db) { $this->server = $server; $this->username = $username; $this->password = $password; $this->db = $db; $this->connect(); } private function connect() { $this->link = mysql_connect($this->server, $this->username, $this->password); mysql_select_db($this->db, $this->link); } public function __sleep() { return array('server', 'username', 'password', 'db'); } public function __wakeup() { $this->connect(); } }?>
函数调取
invoke()
当尝试以调取函数的方式调取一个对象时,__invoke()办法会被主动调取
<?phpclass CallableClass { function __invoke($x) { var_dump($x); } }
【补充】
set_state()
当调取var_export()输出类时,set_state()办法会被调取,本办法的独一参数是一个数组,其中包括按 array('property' => value, ...) 格局摆列的类属性
[留意]var_export()返回关于传递给该函数的变量的构造信息,它和var_dump()相似,不一样的是其返回的表示是合法的PHP代码,也就是说,var_export返回的代码,可以直接当作php代码赋给一个变量。 而这个变量就会取得和被var_export一样的类型的值
<?phpclass A{
public $var1; public $var2; public static function __set_state($an_array)
{
$obj = new A; $obj->var1 = $an_array['var1']; $obj->var2 = $an_array['var2']; return $obj;
}
}
相关参照 :百分百源码网
以上就是php魔术办法简介的具体内容,更多请关注百分百源码网其它相关文章!