Scope Resolution Operator (::)
I realized this when I looked at the joomla source code today. It turns out that this operator can also access non-static methods of the class. It really doesn't surprise me. I have always thought that the scope resolution operator can only access static methods and static member variables of a class.
If you don’t believe it, here is a simple little test code that can prove this.
Copy code The code is as follows:
class A{
private $_name = 'A';
function __construct(){
echo 'A construct
';
}
function test(){
echo 'A test()
';
}
}
class B extends A{
private $_name = 'B';
function __construct(){
parent::__construct();
echo 'B construct
';
}
function test(){
echo 'B test()';
}
}
A::test();
echo '#########
';
B::test();
The result of inputting this code is:
Copy code The code is as follows:
A test()
#########
B test()
Although test() in class A and test in class B are not static methods, they can still be performed in the style of "class name::method name (parameter list)" Correct call. Its effect is the same as newing an instance of a class and then using this instance to call the
test method.
However, if I need to print the name attribute in the test method, what will happen if I call it directly with ::? Let’s first modify the above code.
Copy code The code is as follows:
class A{
private $_name = 'A';
function __construct(){
echo 'A construct
';
}
function test(){
echo 'A test()
', $this ->$_name,'
';
}
}
class B extends A{
private $_name = 'B';
function __construct(){
parent::__construct();
echo 'B construct
';
}
function test(){
echo 'B test()', $this ->_name,'
';
}
}
A::test();
echo '#########
';
B::test();
The result of running the above code is as follows:
Copy code The code is as follows:
Fatal error: Using $this when not in object context in D:wwwtestscoperefe.php on line 9
[html]
That’s what some friends said. You have not instantiated class A at all. Of course, you cannot directly access the member variable $_name using $this->_name. So, can you just change it to self::$_name?
Just do it, modify the above code below
[code]
class A{
private $_name = 'A';
function __construct(){
echo 'A construct
';
}
function test(){
echo 'A test()
', self::$_name,'
';
}
}
class B extends A{
private $_name = 'B';
function __construct(){
parent::__construct();
echo 'B construct
';
}
function test(){
echo 'B test()', $this->_name,'
';
}
}
A::test();
echo '#########
';
B:: test();
Run the above code again, the result is as follows:
Copy the code The code is as follows:
A test() Fatal error: Access to undeclared static property: A::$_name in D:wwwtestscoperefe.php on line 9
Oh, it turns out that you cannot use the self keyword to access non-static methods of the current class.
Now, if you want to call this method correctly, there are two ways:
1. First instantiate the class, and then use the object to call it directly using $this->_name;
2 , set the member variable $_name to static;
I believe everyone can handle the above problem correctly.
Actually, what I really want to say is:
If a method can be called without instantiation, then we'd better modify this method with the static keyword. When implementing a method, only the static member variables of the class are called. In this way, the problems encountered above will not occur.
If a method is not set to static method. Then, the safest way is to use the instance object to make the call. It is safer because the implementation of the method may need to be modified at some point. When modifying, the
non-static member of the class may need to be called. Variables (because, to a large extent, when modifying the implementation of the method, we have forgotten to call it directly with the class name).
My humble opinion.
http://www.bkjia.com/PHPjc/322188.htmlwww.bkjia.comtruehttp: //www.bkjia.com/PHPjc/322188.htmlTechArticleScope Resolution Operator (::) I realized this when I looked at the joomla source code today. It turns out that this operator can also access non-static methods of the class. It really doesn't surprise me. I always thought that...