2017-09-01 8 views
6

मेरे पास एक अजीब कॉम्पोर्टमेंट के बारे में कोई प्रश्न है। इस कोड मेंउसी वर्ग में __callstatic के बजाय __call पर कॉल करें, अगर किसी अन्य वर्ग को कॉल न करें

देखो:

class User 
{ 
    public function can($name) { 
     return call_user_func(array($name, 'test')); 
    } 

    public static function __callStatic($name, $args) { 
     return 'User::__callStatic'; 
    } 

    public function __call($name, $args) { 
     return 'User::__call'; 
    } 
} 

class Foo 
{ 
    public static function __callStatic($name, $args) { 
     return 'Foo::__callStatic'; 
    } 

    public function __call($name, $args) { 
     return 'Foo::__call?'; 
    } 
} 

$u = new User(); 
var_dump($u->can('User')); 
var_dump($u->can('Foo')); 

पहले वर डंप के परिणाम है: "उपयोगकर्ता :: __ कॉल" और दूसरा: "फू :: __ callStatic"

क्यों सबसे पहले फंक्शन __callStatic कॉल नहीं करते हैं?

पीएस: मैं अन्य विषयों को देखता हूं, लेकिन एक व्याख्या नहीं मिला।

धन्यवाद

+0

इस कोड काम करता है:: "समस्या" को हल करने के मैं केवल बुला स्वयं वर्ग के मामले में मेरी समारोह can() में समारोह __callStatic() फोन https://3v4l.org/E1gKl – Edwin

+0

@Edwin मैं पता है :) यह मेरा सवाल नहीं है, मुझे पहले var डंप –

+0

के लिए "उपयोगकर्ता :: __ कॉलस्टैटिक" होने की उम्मीद है, मैंने अब अन्य टिप्पणियों के जवाब में पोस्ट किया है जो अब – Edwin

उत्तर

1

यह सिर्फ गुंजाइश की एक समस्या है जब आप call_user_func कहते हैं।

जब आप पहली बार can फ़ंक्शन को कॉल करते हैं तो आप कक्षा User संदर्भ में हैं और इसमें __call लगेगा। दूसरे कॉल में आपका संदर्भ दूसरी कक्षा के बाहर से है, इसलिए यह __callStatic लेता है। callback manual और call-user-func देखें।

उदाहरण code के लिए:

<?php 

class User 
{ 
    public function can($name) { 
     return call_user_func(array($name, 'test')); 
    } 

    public static function __callStatic($name, $args) { 
     return 'User::__callStatic'; 
    } 

    public function __call($name, $args) { 
     return 'User::__call'; 
    } 
} 

class Foo 
{ 
    public function can($name) { 
     return call_user_func(array($name, 'test')); 
    } 

    public static function __callStatic($name, $args) { 
     return 'Foo::__callStatic'; 
    } 

    public function __call($name, $args) { 
     return 'Foo::__call?'; 
    } 
} 

    function can($name) { 
     return call_user_func(array($name, 'test')); 
} 

$u = new User(); 
$f = new Foo(); 
var_dump($u->can('User')); 
var_dump($u->can('Foo')); 
var_dump($f->can('User')); 
var_dump($f->can('Foo')); 
var_dump(can('User')); 
var_dump(can('Foo')); 

वापस आ जाएगी:

string(12) "User::__call" 
string(17) "Foo::__callStatic" 
string(18) "User::__callStatic" 
string(12) "Foo::__call?" 
string(18) "User::__callStatic" 
string(17) "Foo::__callStatic" 
+2

स्कोप गलत शब्द है, * संदर्भ * वह है जिसे आप ढूंढ रहे हैं। सवाल यह है कि क्यों PHP ने कहा है कि 'user_user_func ([' user ', ...]) '' उपयोगकर्ता' संदर्भ में एक उदाहरण कॉल है, जबकि दूसरे संदर्भ में यह स्थिर है। – deceze

+0

हाँ संदर्भ बेहतर है। यदि आप 'can' फ़ंक्शन स्थिर बना देंगे तो यह' __callStatic' वापस कर देगा, इसलिए मुझे लगता है कि PHP यह पहले स्तर पर कार्यों को खोजने का प्रयास कर रहा है (यदि यह समझ में आता है)। – Edwin

0

आप तुम दोनों को धन्यवाद।

हां यह संदर्भ के कारण है, यह है कि PHP की एक बग (बाद के संस्करण में ठीक है, 7.2 में नहीं, इसलिए ...;)) या यह सिर्फ एक अजीब कॉमेंटपोर्ट है।

@ एडविन मुझे पता है कि क्या मैं स्थिर can() को स्थिर में बदलता हूं, यह काम करेगा, लेकिन मैं नहीं चाहता हूं।

if($name instanceof User) return self::__callStatic($functionName, $args);

संबंधित मुद्दे