gpt4 book ai didi

php - 为什么调用 __call 而不是 __callStatic

转载 作者:可可西里 更新时间:2023-10-31 22:40:37 25 4
gpt4 key购买 nike

我试图引用这个 question在 SO 上,但仍然不明白。

<?php

class A {
public function __call($method, $parameters) {
echo "I'm the __call() magic method".PHP_EOL;
}

public static function __callStatic($method, $parameters) {
echo "I'm the __callStatic() magic method".PHP_EOL;
}
}

class B extends A {
public function bar() {
A::foo();
}

public function foo() {
parent::foo();
}
}

(new B)->bar();
(new B)->foo();

据我了解,bar 函数静态调用类 A 上的 foo 方法,但 foo 方法使用 A 的实例调用该方法,该实例是 B 的父级。我期待它应该给我:

I'm the __callStatic() magic method
I'm the __call() magic method

但是,显然,我得到:

I'm the __call() magic method
I'm the __call() magic method

最佳答案

来自相关issue :

...A::foo() is not necessarily a static call. Namely, if foo() is not static and there is a compatible context ($this exists and its class is either the class of the target method or a subclass of it), an instance call will be made.

如果 foo()static,它会按您预期的那样工作:

class A {
public function __call($method, $parameters) {
echo "I'm the __call() magic method $method".PHP_EOL;
}

public static function __callStatic($method, $parameters) {
echo "I'm the __callStatic() magic method $method".PHP_EOL;
}
}

class B extends A {
public static function foo() { // <-- static method
parent::foo();
}
}

(new B)->foo();

I'm the __callStatic() magic method foo

关于php - 为什么调用 __call 而不是 __callStatic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41179518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com