PHP 魔术方法


在本教程中,我们将介绍一些重要的PHP魔术方法,您可以使用它们来处理不存在的成员和方法。

PHP的__get()和__set()方法

PHP提供了一对魔术方法来处理不存在的或私有属性的访问:

  • 每次当您试图访问对象的不存在或私有的属性时,都会调用__get()方法。
  • 每次当您试图修改对象的不存在或私有的属性时,都会调用__set()方法。

让我们看下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
 
class Person{
private $firstName;
 
public function __get($propertyName){
echo "试图访问不存在的属性: $propertyName ";
}
public function __set($propertyNane, $propertyValue){
echo "试图修改不存在的属性: $propertyNane ";
}
}
 
$p = new Person();
 
$p->firstName = 'alice';
echo $p->firstName;
 
$p->lastName = 'itroad';
echo $p->lastName;

使用__get()__set()可以把类的单独属性放到一个关联数组中,请看下面的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
 
class Person{
private $properties;
 
public function __get($propertyName){
if(array_key_exists($propertyName, $properties)){
return $this->properties[$propertyName];
}
 
}
public function __set($propertyNane, $propertyValue){
$this->properties[$propertyNane] = $propertyValue;
}
}
 
$p = new Person();
$p->lastName = 'alice';
$p->firstName = 'itroad';
 
var_dump($p);

PHP __call() 方法

与_get()和_set()方法类似,当调用类中不存在的方法时,会自动调用_call()魔术方法。

下面的示例演示了一个简单的string类,它支持三种方法:strlen()、strtoupper()和strtolower()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
 
class CString{
private $str = '';
 
private $APIs = array('strlen','strtoupper','strtolower');
 
public function __construct($str){
$this->str = $str;
 
}
public function __call($method,$args){
if(in_array($method, $this->APIs)){
array_unshift($args, $this->str);
return call_user_func_array($method, $args);
}else{
die('错误:调用不支持的方法: ' . $method);
}
}
}
 
$str = new CString('这是一字符串对象');
echo $str->strlen() . '';
echo $str->strtoupper() . '';
echo $str->strtolower() . '';
 
echo $str->len(); // 错误:调用不支持的方法: len

PHP使用双下划线(__)作为类中魔术方法的前缀,因此建议您定义方法名时不要以双下划线(__)开头。

注意,构造函数和析构函数方法(__construct() 和 __destruct() )也是魔术方法。


原文链接:https://codingdict.com/