जब बायां हिस्सा एक ऑब्जेक्ट उदाहरण है, तो आप ->
का उपयोग करते हैं। अन्यथा, आप ::
का उपयोग करें।
इसका मतलब है कि ->
ज्यादातर, उदाहरण के सदस्यों तक पहुँचने के लिए प्रयोग किया जाता है, जबकि ::
आमतौर पर स्थिर सदस्यों तक पहुँचने के लिए (प्रयोग किया जाता है (हालांकि यह भी स्थिर सदस्यों, इस तरह के उपयोग को हतोत्साहित किया जाता का उपयोग करने के लिए इस्तेमाल किया जा सकता है), हालांकि कुछ विशेष मामलों में, इसका उपयोग उदाहरण सदस्यों तक पहुंचने के लिए किया जाता है)।
सामान्य तौर पर, ::
scope resolution के लिए प्रयोग किया जाता है, और यह या तो एक वर्ग के नाम, parent
, self
, या (पीएचपी 5.3 में), उसके बाईं ओर static
हो सकता है। parent
उस वर्ग के सुपरक्लास के दायरे को संदर्भित करता है जहां इसका उपयोग किया जाता है; self
उस वर्ग के दायरे को संदर्भित करता है जहां इसका उपयोग किया जाता है; static
"कॉल स्कोप" को संदर्भित करता है (late static bindings देखें)।
नियम है कि ::
के साथ एक कॉल एक उदाहरण कॉल है यदि और केवल यदि:
- लक्ष्य विधि स्थिर और
- वहाँ समय में एक संगत वस्तु संदर्भ है के रूप में घोषित नहीं किया गया है कॉल की, इन अर्थ सच होना चाहिए:
- कॉल एक संदर्भ में, जहां
$this
मौजूद है से बनाया गया है और
$this
की कक्षा या तो उस विधि का वर्ग है जिसे इसके नाम या उप-वर्ग कहा जाता है।
उदाहरण:
class A {
public function func_instance() {
echo "in ", __METHOD__, "\n";
}
public function callDynamic() {
echo "in ", __METHOD__, "\n";
B::dyn();
}
}
class B extends A {
public static $prop_static = 'B::$prop_static value';
public $prop_instance = 'B::$prop_instance value';
public function func_instance() {
echo "in ", __METHOD__, "\n";
/* this is one exception where :: is required to access an
* instance member.
* The super implementation of func_instance is being
* accessed here */
parent::func_instance();
A::func_instance(); //same as the statement above
}
public static function func_static() {
echo "in ", __METHOD__, "\n";
}
public function __call($name, $arguments) {
echo "in dynamic $name (__call)", "\n";
}
public static function __callStatic($name, $arguments) {
echo "in dynamic $name (__callStatic)", "\n";
}
}
echo 'B::$prop_static: ', B::$prop_static, "\n";
echo 'B::func_static(): ', B::func_static(), "\n";
$a = new A;
$b = new B;
echo '$b->prop_instance: ', $b->prop_instance, "\n";
//not recommended (static method called as instance method):
echo '$b->func_static(): ', $b->func_static(), "\n";
echo '$b->func_instance():', "\n", $b->func_instance(), "\n";
/* This is more tricky
* in the first case, a static call is made because $this is an
* instance of A, so B::dyn() is a method of an incompatible class
*/
echo '$a->dyn():', "\n", $a->callDynamic(), "\n";
/* in this case, an instance call is made because $this is an
* instance of B (despite the fact we are in a method of A), so
* B::dyn() is a method of a compatible class (namely, it's the
* same class as the object's)
*/
echo '$b->dyn():', "\n", $b->callDynamic(), "\n";
आउटपुट:
B::$prop_static: B::$prop_static value
B::func_static(): in B::func_static
$b->prop_instance: B::$prop_instance value
$b->func_static(): in B::func_static
$b->func_instance():
in B::func_instance
in A::func_instance
in A::func_instance
$a->dyn():
in A::callDynamic
in dynamic dyn (__callStatic)
$b->dyn():
in A::callDynamic
in dynamic dyn (__call)
संभावित डुप्लिकेट [संदर्भ - PHP में यह प्रतीक क्या मतलब है?] (Http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) – Gordon
संभावित डुप्लिकेट [PHP में डबल कॉलन और तीर ऑपरेटरों के बीच अंतर?] (http://stackoverflow.com/questions/3961456/difference-between-double-colon-and-arrow-operators-in-php) –