Home  >  Article  >  Backend Development  >  The difference between self, parent and this in php class and an introduction to examples

The difference between self, parent and this in php class and an introduction to examples

高洛峰
高洛峰Original
2017-01-21 13:13:051664browse

1, 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 properties in this class, or can call adjustable methods and properties in the parent class

2, self

1, self can access this class Static properties and static methods in the class can access static properties and static methods in the parent class.
2. When using self, you don’t need to instantiate


3. parent

1. Parent can access static properties and static methods in the parent class.
2. When using parent, you don’t need to instantiate

<?php
class test{
 public $public;
 private $private;
 protected $protected;
 static $instance;
 static $good = &#39;tankzhang <br>&#39;;
 public $tank = &#39;zhangying <br>&#39;;
 public  function __construct(){
 $this->public    = &#39;public     <br>&#39;;
 $this->private   = &#39;private    <br>&#39;;
 $this->protected = &#39;protected  <br>&#39;;
 }
 public function tank(){                          //私有方法不能继承,换成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<br>";
 echo $this->public;
 }
 protected  function pro_function(){
 echo "you request protected function<br>";
 echo $this->protected;
 }
 private function pri_function(){
 echo "you request private function<br>";
 echo $this->private;
 }
 static function sta_function(){
 echo "you request static function<br>";
 }
}
class test1 extends test{
 static $love = "tank <br>";
 private $aaaaaaa = "ying <br>";
 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<br>";
 }
}
error_reporting(E_ALL);
$test = new test1();
$test->tank();            //子类和父类有相同名字的属性和方法,实例化子类时,会调用子类中的方法。
test1::test1_function();
test1::extends_function();  //执行一部分后,报Fatal error: Using $this when not in object context in D:\xampp\htdocs\mytest\www4.php on line 32
?>

1. When we call the $test->tank(); method, $this in the tank is an object. This Objects can call methods and attributes of this class and parent class,

2, test1::test1_function(); When we use static methods to call non-static methods, a warning will be displayed, Non- static method test::test1_function() should not be called statically It can be seen that self can call this class and the static properties in the parent class, and parent can call the static properties in the parent class. If they call non-static properties, an error will be reported. There is a comment

3 in the code, 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

For more articles about the differences between self, parent, and this in PHP class and examples, please pay attention to the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn