PHP类学习_魔术方法
__sleep()
:serialize()
函数会检查类中是否存在一个魔术方法 __sleep()
。如果存在,该方法会先被调用,然后才执行序列化操作。
__wakeup
:unserialize()
会检查是否存在一个 __wakeup()
方法。如果存在,则会先调用__wakeup
方法,预先准备对象需要的资源。
__toString()
: __toString()
方法用于一个类被当成字符串时应怎样回应。
__clone()
:当复制完成时,如果定义了__clone()
方法,则新创建的对象(复制生成的对象)中的 __clone()
方法会被调用,可用于修改属性的值(如果有必要的话)。
创建类并实例化
class user{
function load_info($username){
//从数据库加载用户信息
}
}
$user =new user;
$user->load_info($_GET['username'])
__construct
class user{
public $username;
function __construct($username,$password){
if($this->validate_user($username,$password)){
$this->username=$username;
}
}
}
$user=new user('Grif','Misto');
__destruct
class Database{
function __destruct(){
db_close($this->handle);//关闭数据库连接
}
}
__set()、__get()、__isset()、__unset、
__set()
:在给不可访问属性赋值时,__set()
会被调用。
__get()
:读取不可访问属性的值时,__get()
会被调用。
__isset()
:当对不可访问属性调用 isset()
或 empty() 时,__isset()
会被调用。
__unset
:当对不可访问属性调用 unset()
时,__unset()
会被调用。
class Person{
private $__data=array();
private $notRead='asdasd';
public function __get($property){
if(isset($this->__data[$property])){
return $this->__data[$property];
}else{
return false;
}
}
//限定只能设置预定义的属性
public function __set($property,$value){
if(isset($this->__data[$property])){
return $this->__data[$property]=$value;
}else{
return false;
}
}
}
$johnwood=new Person;
$johnwood->email='jonathan@worp.mil'; // 设置 $user->__data['email']
print $johnwood->email; //读取 $user->__data['email']
print $johnwood->notRead; //以定义的属性无法通过__get获取
设置数据时,__set()
会重写$__data
中的元素。类似地,可以使用__get()
拦截调用,并返回正确的数组元素。
__call、__callStatic
__call()
:在对象中调用一个不可访问方法时,__call()
会被调用。
__callStatic()
:静态上下文中调用一个不可访问方法时,__callStatic()
会被调用。
$name 参数是要调用的方法名称。$arguments 参数是一个枚举数组,包含着要传递给方法 $name 的参数。
class Address{
protected $city;
public function setCity($city){
$this->city=$city;
}
public function getCity(){
return $this->city;
}
}
class Person{
protected $name;
protected $address;
protected $method;
protected $arguments;
public function __construct(){
$this->address=new Address;
}
public function setName($name){
$this->name=$name;
}
public function getName(){
return $this->name;
}
public function __call($method,$arguments){
if(method_exists($this->address,$method)){
// print $method;
// var_dump($arguments);
return call_user_func_array(array($this->address,$method), $arguments);
}
}
}
$rasums=new Person;
$rasums->setName('Rasmus Lerdorf');
$rasums->setCity('Sunnyval');
print $rasums->getName().'lives in '.$rasums->getCity().'.';
调用了个Person
中不存在的方法,对象调用魔术方法__call()
class User{
static function find($args){
//实际逻辑放在这里
//例如,一个数据库查询
//SELECT user From users where $args['field']=$args['value']
return print 'get find function Return';
}
static function __callStatic($method,$args){
if(preg_match('/^findBy(.+)$/',$method,$matches)){
return static::find(array('field'=>$matches[1],
'value'=>$args[0]));
}
}
}
$user = User::findById(123);
$user=User::findByEmail('rasums@php.net');
将执行findByEmail
方法的实际逻辑传到User::find()
当尝试以调用函数的方式调用一个对象时,__invoke()
方法会被自动调用。
class CallableClass
{
function __invoke($x) {
var_dump($x);
}
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
__set_state
// static __set_state ( array $properties ) : object
// 自 PHP 5.1.0 起当调用 var_export() 导出类时,此静态 方法会被调用。
class A
{
public $var1;
public $var2;
public static function __set_state($an_array) // As of PHP 5.1.0
{
$obj = new A;
$obj->var1 = $an_array['var1'];
$obj->var2 = $an_array['var2'];
return $obj;
}
}
$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';
eval('$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array(
// 'var1' => 5,
// 'var2' => 'foo',
// ));
var_dump($b);
__debugInfo
__debugInfo ( void ):数组
// 转储对象以获取应显示的属性时 ,var_dump()
调用此方法。如果未在对象上定义该方法,则将显示所有公共属性,受保护属性和私有属性。
class C {
private $prop;
public function __construct($val) {
$this->prop = $val;
}
public function __debugInfo() {
return [
'propSquared' => $this->prop ** 2,
];
}
}
var_dump(new C(42));
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!