少女祈祷中...

1. __construct()

  • 功能:构造函数,在创建对象时自动调用,用于初始化对象的属性。
  • 人话:类被使用就会被调用
  • 示例
1
2
3
4
5
6
7
8
9
10
11
12
class Person {
public $name;
public $age;

public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
}

$person = new Person('John', 30);
echo $person->name; // 输出: John

2. __destruct()

  • 功能:析构函数,在对象被销毁时自动调用,通常用于释放对象占用的资源,如关闭文件、数据库连接等。
  • 人话:整体脚本结束时候调用
  • 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class DatabaseConnection {
private $conn;

public function __construct() {
$this->conn = new mysqli('localhost', 'user', 'password', 'dbname');
}

public function __destruct() {
if ($this->conn) {
$this->conn->close();
}
}
}

$db = new DatabaseConnection();
// 当脚本执行结束或对象被显式销毁时,__destruct() 方法会被调用

3. __toString()

  • 功能:当对象被当作字符串使用时自动调用,必须返回一个字符串。

    触发 __toString 方法的情况

    触发方式 描述 示例代码
    字符串拼接 对象参与字符串拼接操作时,触发 __toString 方法。在需要将对象与字符串组合输出的场景中会用到。 php class StringableClass { public function __toString() { return "触发 __toString"; } } $obj = new StringableClass(); echo "拼接结果:" . $obj;
    echoprint 语句 直接使用 echoprint 输出对象时,触发 __toString 方法,是一种常见的输出对象字符串表示的方式。 php class StringableClass { public function __toString() { return "触发 __toString"; } } $obj = new StringableClass(); echo $obj;
    printfsprintf 函数 在使用字符串格式化函数,将对象作为字符串参数传递时,触发 __toString 方法,用于格式化输出对象的字符串表示。 php class StringableClass { public function __toString() { return "触发 __toString"; } } $obj = new StringableClass(); printf("格式化结果:%s", $obj);
    implode 函数 当对象在数组中,使用 implode 函数将数组转换为字符串时,触发对象的 __toString 方法,用于将包含对象的数组转换为字符串。 php class StringableClass { public function __toString() { return "触发 __toString"; } } $obj = new StringableClass(); $arr = [$obj]; echo implode(", ", $arr);
    字符串强制类型转换 使用 (string) 进行强制类型转换时,触发 __toString 方法,用于将对象显式转换为字符串类型。 php class StringableClass { public function __toString() { return "触发 __toString"; } } $obj = new StringableClass(); $str = (string)$obj; echo $str;
    json_encode 处理对象数组时 当使用 json_encode 对包含对象的数组进行编码时,如果对象实现了 __toString 方法,会触发该方法,用于在 JSON 编码时获取对象的字符串表示。 php class User { public function __toString() { return "User Object"; } } $user = new User(); $arr = [$user]; echo json_encode($arr);
    setcookie 函数 在设置 cookie 的值时,如果传入的是一个实现了 __toString 方法的对象,会触发该方法,用于将对象的值设置为 cookie 的值。 php class CookieValue { public function __toString() { return "cookie_value"; } } $cookieValue = new CookieValue(); setcookie('test_cookie', $cookieValue);
    Twig 模板引擎输出对象 在 Twig 模板中输出对象时,如果对象实现了 __toString 方法,会触发该方法,用于在模板中展示对象的字符串表示。 php require_once 'vendor/autoload.php'; class MyObject { public function __toString() { return "My Object String"; } } $loader = new \Twig\Loader\ArrayLoader([ 'index.html' => 'Object value: {{ myObject }}' ]); $twig = new \Twig\Environment($loader); $myObject = new MyObject(); echo $twig->render('index.html', ['myObject' => $myObject]);
    Smarty 模板引擎使用对象 在 Smarty 模板中使用对象时,如果对象实现了 __toString 方法,会触发该方法,用于在 Smarty 模板中展示对象的字符串表示。 php require_once 'libs/Smarty.class.php'; class SmartyObject { public function __toString() { return "Smarty Object String"; } } $smarty = new Smarty(); $smartyObject = new SmartyObject(); $smarty->assign('myObject', $smartyObject); $smarty->display('index.tpl');
  • 人话:被强制为echo输出时候调用

  • 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Book {
public $title;

public function __construct($title) {
$this->title = $title;
}

public function __toString() {
return "Book title: " . $this->title;
}
}

$book = new Book('PHP Programming');
echo $book; // 输出: Book title: PHP Programming

4. __call()

  • 功能:当调用一个对象中不存在的方法时自动调用,接收两个参数:方法名和参数数组。
  • 人话:使用同一个类中不可访问的方法时候调用(比如私有和不存在的
  • 示例
1
2
3
4
5
6
7
8
class MyClass {
public function __call($method, $arguments) {
echo "Call to undefined method: $method with arguments: " . implode(', ', $arguments);
}
}

$obj = new MyClass();
$obj->unknownMethod('arg1', 'arg2'); // 输出: Call to undefined method: unknownMethod with arguments: arg1, arg2

5. __callStatic()

  • 功能:当调用一个类中不存在的静态方法时自动调用,接收两个参数:方法名和参数数组。

  • 静态是什么?

    1
    2
    3
    使用static进行定义
    echo MathUtil::add(2, 3); // 输出:5
    ::进行引用
  • 示例

1
2
3
4
5
6
7
class MyStaticClass {
public static function __callStatic($method, $arguments) {
echo "Call to undefined static method: $method with arguments: " . implode(', ', $arguments);
}
}

MyStaticClass::unknownStaticMethod('arg1', 'arg2'); // 输出: Call to undefined static method: unknownStaticMethod with arguments: arg1, arg2

6. __get()

  • 功能:当访问一个对象中不存在或不可访问的属性时自动调用,接收一个参数:属性名。
  • 人话:调用不存在的属性时候调用
  • 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
class MyObject {
private $data = [];

public function __get($property) {
if (array_key_exists($property, $this->data)) {
return $this->data[$property];
}
return null;
}
}

$obj = new MyObject();
$value = $obj->nonExistentProperty; // 会调用 __get() 方法

7. __set()

  • 功能:当给一个对象中不存在或不可访问的属性赋值时自动调用,接收两个参数:属性名和属性值。
  • 示例
1
2
3
4
5
6
7
8
9
10
class MyObject {
private $data = [];

public function __set($property, $value) {
$this->data[$property] = $value;
}
}

$obj = new MyObject();
$obj->newProperty = 'new value'; // 会调用 __set() 方法

8. __isset()

  • 功能:当使用 isset() 函数检查一个对象中不存在或不可访问的属性时自动调用,接收一个参数:属性名。
  • 示例
1
2
3
4
5
6
7
8
9
10
class MyObject {
private $data = [];

public function __isset($property) {
return isset($this->data[$property]);
}
}

$obj = new MyObject();
var_dump(isset($obj->nonExistentProperty)); // 会调用 __isset() 方法

9. __unset()

  • 功能:当使用 unset() 函数删除一个对象中不存在或不可访问的属性时自动调用,接收一个参数:属性名。

  • 示例

1
2
3
4
5
6
7
8
9
10
11
12
class MyObject {
private $data = [];

public function __unset($property) {
if (array_key_exists($property, $this->data)) {
unset($this->data[$property]);
}
}
}

$obj = new MyObject();
unset($obj->nonExistentProperty); // 会调用 __unset() 方法

10. __clone()

  • 功能:当使用 clone 关键字克隆一个对象时自动调用,用于自定义对象的克隆行为。
  • 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
class MyClass {
public $value;

public function __clone() {
// 可以在这里对克隆后的对象进行一些额外的处理
$this->value = $this->value * 2;
}
}

$obj1 = new MyClass();
$obj1->value = 10;
$obj2 = clone $obj1;
echo $obj2->value; // 输出: 20

11.__invoke

一些会触发的函数:

return 直接返回
直接将对象当作函数调用 当代码中使用 对象名() 的形式调用对象时,会触发 __invoke 方法。这种方式是最直观的调用对象 __invoke 方法的形式,就像调用普通函数一样使用对象。 php class CallableClass { public function __invoke() { echo "触发 __invoke"; } } $obj = new CallableClass(); $obj();
call_user_func 函数 该函数用于调用一个回调函数,当传入的回调是一个对象时,会触发对象的 __invoke 方法。它可以动态地调用可调用对象,在需要灵活调用不同函数或对象的场景中很有用。 php class CallableClass { public function __invoke() { echo "触发 __invoke"; } } $obj = new CallableClass(); call_user_func($obj);
call_user_func_array 函数 call_user_func 类似,但可以传入数组形式的参数,当传入的回调是对象时,触发 __invoke 方法。适用于需要传递多个参数给可调用对象的情况。 php class CallableClass { public function __invoke($param) { echo "触发 __invoke,参数:$param"; } } $obj = new CallableClass(); call_user_func_array($obj, ['test']);
array_map 函数 将回调函数作用到给定数组的每个元素上。当回调函数是一个可调用对象时,会触发该对象的 __invoke 方法,用于对数组元素进行批量处理。 php class Multiplier { public function __invoke($num) { return $num * 2; } } $numbers = [1, 2, 3]; $multiplier = new Multiplier(); $result = array_map($multiplier, $numbers); print_r($result);
array_filter 函数 用回调函数过滤数组中的元素。若回调函数是一个可调用对象,会触发其 __invoke 方法,用于筛选出符合条件的数组元素。 php class EvenChecker { public function __invoke($num) { return $num % 2 === 0; } } $numbers = [1, 2, 3, 4]; $evenChecker = new EvenChecker(); $result = array_filter($numbers, $evenChecker); print_r($result);
usort 函数 使用用户自定义的比较函数对数组进行排序。当比较函数是一个可调用对象时,会触发该对象的 __invoke 方法,用于实现自定义的排序规则。 php class NumberComparator { public function __invoke($a, $b) { return $a - $b; } } $numbers = [3, 1, 2]; $comparator = new NumberComparator(); usort($numbers, $comparator); print_r($numbers);
array_reduce 函数 用回调函数迭代地将数组简化为单一的值。若回调函数是可调用对象,会触发 __invoke 方法,用于对数组元素进行累积计算。 php class Summer { public function __invoke($carry, $item) { return $carry + $item; } } $numbers = [1, 2, 3]; $summer = new Summer(); $result = array_reduce($numbers, $summer, 0); echo $result;