One, this
1. To use this, you must have an object context, otherwise it will report an error, Fatal error: Using $this when not in object context.
2. this can call methods and attributes in this class, or adjustable methods and attributes in the parent class
Two, self
1. Self can access static properties and static methods in this class, and can access static properties and static methods in the parent class.
2. When using self, you don’t need to instantiate it
Three, parent
1. Parent can access static properties and static methods in the parent class.
2. When using parent, you don’t need to instantiate it
class test{
public $public;
private $private;
protected $protected;
static $instance;
static $good = 'tankzhang
';
public $tank = 'zhangying
';
public function __construct(){
$this->public = 'public
';
$this->private = 'private
';
$this ->protected = 'protected
';
}
public function tank(){ //Private methods cannot be inherited, replace them with public, protected
if (!isset(self::$instance[get_class()]))
{
$c = get_class();
self::$instance = new $c;
}
return self::$instance;
}
public function pub_function() {
echo "you request public function
";
echo $this->public;
}
protected function pro_function(){
echo "you request protected function
";
echo $this->protected;
}
private function pri_function(){
echo "you request private function
";
echo $this->private;
}
static function sta_function(){
echo "you request static function
";
}
}
class test1 extends test{
static $love = "tank
";
private $aaaaaaa = "ying
";
public function __construct(){
parent::tank();
parent::__construct();
}
public function tank(){
echo $this-> ;public;
echo $this->protected;
echo $this->aaaaaaa;
$this->pro_function();
}
public function test1_function(){
echo self::$love;
echo self::$good;
echo parent::$good;
echo parent::$tank; / /Fatal error: Access to undeclared static property: test::$tank
echo self::$tank; //Fatal error: Access to undeclared static property: test::$tank
}
static function extends_function(){
parent::sta_function();
self::pro_function();
echo "you request extends_private function
";
}
}
error_reporting(E_ALL);
$test = new test1();
$test->tank(); //The subclass and the parent class have attributes and methods with the same name, instantiate the subclass , the method in the subclass will be called.
test1::test1_function();
test1::extends_function(); //After executing a part, a Fatal error is reported: Using $this when not in object context in D:xampphtdocsmytestwww4.php on line 32
?>
1. When we call the $test->tank(); method, $this in the tank is an object. This object can call methods and attributes in this class and the parent class,
2, test1::test1_function(); When we use a static method to call a non-static method, a warning will be displayed. Non-static method test::test1_function() should not be called statically. You can see that, Self can call the static properties of this class and the parent class, and parent can call the static properties of the parent class. If they call non-static properties, an error will be reported. There are comments in the code
3, test1::extends_function(); This step will report an error, reporting that $this is used in a non-object. Why is this? test1::extends_function(); just calls a method in the class and is not instantiated, so there is no object at all. When $this is used in the parent class, an error will be reported