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 协议 ,转载请注明出处!