4

使用 $this 来引用当前对象。使用 self 来引用当前类。换句话说,对非静态成员使用 $this->member,对静态成员使用 self::$member。

http://board.phpbuilder.com/showthread.php?10354489-RESOLVED-php-class-quot-this-quot-or-quot-self-quot-keyword

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::$nameDemo::$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();

前面两个类Person1Person2产生相同的输出,如下所示。

Name : xxx
Address : yyy

Preson1(如在类中,show()方法中)有什么区别

$this->name;
$this->address;

和(如在Preson2类中,show()方法)

self::$name;
self::$address;

在这种情况下

4

2 回答 2

2

在类中使用Demo::$nameand self::$namefromDemo实际上是相同的。您可以通过名称访问它,因为该变量是静态且可访问的,就像您可以使用类的名称从不同的类访问公共静态变量一样,例如。

因此,在这种情况下,按名称访问主要只是能够从可访问类访问任何公共静态变量的副产品。

第二个输出与第一个输出相同,因为您显然是在创建一个新Person1对象,而不是一个Person2对象(请参阅$p2=new Person1("xxx", "yyy");:)

如果您要创建一个Person2对象,那么您会得到一个错误,因为您不能将值分配给一个尚未声明的静态变量(您在 and 中有对象级变量nameaddress但不是静态的)。如果您将它们声明为static,那么您将从修改后的show方法中获得相同的输出,因为它使用的是静态调用。

如果您不确定对象(读取:实例)变量和静态变量之间的区别是什么,那么我鼓励您参与一些谷歌搜索,但基本上静态变量存在于类级别,而不是对象级别,并且可以访问来自指定类型的任何类方法或对象(例如,如果您有 100 个实例,Person2它们都可以访问同一个 name变量),而实例变量对于单个对象本身是唯一的。

于 2012-07-23T17:39:59.907 回答
1

在您的第一个示例中self::$nameDemo::$name如果在Demo类中使用它们实际上是相同的。

您的第二个示例应该会导致错误,因为您尚未声明静态$name$address属性并且正在访问它们。它适用于您的情况,因为您正在创建一个实例Person1(可能是无意的):

$p2=new Person1("xxx", "yyy");
于 2012-07-23T17:52:11.337 回答