[英]__callStatic(): instantiating objects from static context?
我很困惑PHP中的“靜態”和“動態”函數和對象如何協同工作,特別是關於__callStatic()。
__callStatic()的工作原理如下:
你可以有一個普通的類MyClass,你可以在類中放置一個名為__callStatic()的靜態函數,只有當MyClass沒有你想要的名字的靜態函數時才會調用它。
即我調用
MyClass::newFunction();
newFunction()
是靜態調用的,但MyClass
沒有聲明它。 所以,然后__callStatic()
,你可以說$myObject=new SomeOtherClass(); $myObject->newFunction();
它調用你想要的函數但是在其他一些對象上。
精簡版:
換句話說,__ callStatic()執行此操作:
MyClass::newFunction();
這隱藏了這個:
(new SomeOtherClass())->newFunction();
說什么呢? 看起來代碼從類中調用靜態函數看起來就是從其他類調用該函數並通過實例化調用它,而不是靜態調用。
請解釋一下!
為什么這樣做? 你可以在其他地方做這樣的事情,比如C ++或Java嗎? 我正在尋找關於語言中靜態和動態函數的簡短而詳細的解釋,在這種情況下,__ callStatic()是否violates
或conforms
語言結構的大圖。 或者它完全是一種新的語言結構。
__callStatic()
為開發人員提供了對static
方法調用做出反應的可能性,即使這些方法不存在或者無法從類外部訪問( protected
)。 這對於動態的通用代碼生成很有用。
示例:您有這個類:
class Test {
protected static function myProtected($test) {
var_dump(__METHOD__, $test);
}
public static function __callStatic($method, $args) {
switch($method) {
case 'foo' :
echo 'You have called foo()';
var_dump($args);
break;
case 'helloWorld':
echo 'Hello ' . $args[0];
break;
case 'myProtected':
return call_user_func_array(
array(get_called_class(), 'myProtected'),
$args
);
break;
}
}
}
試着打電話:
// these ones does not *really* exist
Test::foo('bar');
Test::helloWorld('hek2mgl');
// this one wouldn't be accessible
Test::myProtected('foo');
為什么這樣做?
這是一個存在主義的問題,但我認為答案是“因為你可以”。 PHP是一種動態語言,這些構造__call
和__callStatic()
展示了它的強大功能,這種功能在某些情況下很有用。
你可以在其他地方做這樣的事情,比如C ++或Java嗎?
不,他們沒有類似的魔術方法。
我正在尋找關於語言中靜態和動態函數的簡短而詳細的解釋
靜態函數封裝代碼。 即使沒有實例化類,它們也存在。 您可以使用范圍解析運算符來調用它們。 動態功能很好,很動態
.. __callStatic()違反或符合語言結構的大圖。 或者它完全是一種新的語言結構。
它是動態語言的構造。 不確定所有動態語言中是否存在此功能,但它確實存在於PHP中。 它沒有違反任何內容,只是在您調用的函數在當前范圍內不存在/不可訪問時引入了直通catch-all函數的新范例。
我不完全確定為什么__callStatic()與此相關?
我不太看到以下區別:
class Foo {
static function bar() {
$obj = new Foo();
$obj->quux();
}
function quux() {
return "whatever";
}
}
和你的榜樣? 在這兩種情況下,您都在調用一個靜態方法,該方法在同一個類的對象上調用另一個方法。
是的,那是可能的。 實際上這樣做表明你可能想要重構你的代碼。 在該示例中,您將使用其默認狀態實例化對象,在其上執行方法然后將對象拋棄。 這表明無論方法做什么,實際上並不需要對象狀態。 這意味着它要么不屬於這個類,要么可以簡單地重寫為靜態方法本身。
你知道__call嗎? 它與__callStatic的作用相同,但是對象而不是類。 例如$ foo-> myMissingMethod(); 如果$ foo是一個實例的類存在這樣的方法,那么會轉到__call。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.