使用$ this来引用当前对象。用self来指代 现在的课程。换句话说,将$ this->成员用于非静态 成员,使用self :: $ member表示静态成员。
class Demo
{
private static $name;
private $age;
public function __construct($name, $age)
{
self::$name = $name;
$this->age=$age;
}
public function show()
{
echo "Name : ", self::$name, "<br/>"; //Accessing by self
echo "Name : ", Demo::$name, "<br/>"; //Accessing by class name
echo "Age : ", $this->age, "<br/>";
}
}
$demo = new Demo("Tiny", 13);
$demo->show();
这会产生以下输出。
Name : Tiny
Name : Tiny
Age : 13
前面代码段中的self::$name
和Demo::$name
之间有什么区别?
class Person1
{
private $name;
private $address;
public function __construct($name,$address)
{
$this->name = $name;
$this->address = $address;
}
public function show()
{
echo "Name : ", $this->name, "<br/>";
echo "Address : ", $this->address, "<br/>"; //Accessing by this
}
}
$p1=new Person1("xxx", "yyy");
$p1->show();
class Person2
{
private $name;
private $address;
public function __construct($name,$address)
{
self::$name = $name;
self::$address = $address;
}
public function show()
{
echo "Name : ", self::$name, "<br/>";
echo "Address : ", self::$address, "<br/>"; //Accessing by self
}
}
$p2=new Person1("xxx", "yyy");
$p2->show();
在两个类Person1
和Person2
之前产生相同的输出如下。
Name : xxx
Address : yyy
有什么区别(如Preson1
类,show()
方法)
$this->name;
$this->address;
和(在Preson2
类中,show()
方法)
self::$name;
self::$address;
在此背景下?
答案 0 :(得分:2)
在Demo::$name
类中使用self::$name
和Demo
实际上是相同的。你可以通过名称访问它,因为变量是静态的和可访问的,就像你能够使用类的名称从不同的类访问 public 静态变量一样,示例
因此,在这种情况下,按名称访问主要是能够从可访问类访问任何公共静态变量的副产品。
第二个输出与第一个输出相同,因为您显然正在创建一个新的Person1
对象,而不是Person2
个对象(请参阅:$p2=new Person1("xxx", "yyy");
)
如果你要创建一个Person2
对象,那么你会得到一个错误,因为你不能将值赋给一个尚未声明的静态变量(你有对象级变量)在name
和address
中,但不是静态的)。如果您将它们声明为static
,那么您将从修改后的show
方法获得相同的输出,因为它正在使用静态调用。
如果您不确定object(读取:实例)变量和静态变量之间的区别是什么,那么我建议您参与一些Google搜索,但基本上静态变量存在于类级别,而不是对象级别,并且可以从指定类型的任何类方法或对象访问(因此,如果您有100个Person2
个实例,则他们都可以访问相同的 name
变量,例如,实例变量对于单个对象本身是唯一的。
答案 1 :(得分:1)
在您的第一个示例中self::$name
和Demo::$name
在Demo
类中使用时实际上是相同的。
您的第二个示例应该会导致错误,因为您尚未声明静态$name
和$address
属性并正在访问它们。它适用于您的情况,因为您正在创建Person1
的实例(可能是无意的):
$p2=new Person1("xxx", "yyy");