1
<?php
class c1
{
  public static function f1()
  {
    return "hello";
  }

  public static $a=10;

  public function f2()
  {
    echo $this->f1(); //prints "hello"
    echo $this->a;//ERROR:Undefined property: c1::$a in C:\wamp\www\class_in_php\example5.php on line 14
  }
}

$obj1=new c1;
$obj1->f2();
?>

为什么我们不能使用 $this 或该类的对象访问一个类的静态变量???但是我们可以使用 $this 或该类的对象来访问该类的静态函数。

这种现象背后的原因是什么?

4

3 回答 3

6

您应该使用self::而不是$this->访问静态成员。

原因是$this指的是类的当前实例,而静态成员是类本身的一部分,而不是实例的一部分。

于 2013-09-08T08:24:29.573 回答
2

静态变量不属于“实例”,而是属于类本身。当你在运行时拥有类的实际“实例”时,只有这样$this指针才有意义:它意味着“我现在发现自己在里面的这个实例”......你怎么能使用 $this 指针来引用实例之外不存在的东西?

当我第一次学习 C++ 时,它(我认为是 Metacomco)是一个系统,它实际上使用大量 C 预处理器宏来模拟对象,看到并因此理解$thisthis在 C++ 中)实际上只是一个额外的参数作为第一个参数传递给所有方法函数:

this->foo("Hello");
this->bar(42, "Finished");

实际上是这样执行的:

foo(this_ptr, "Hello");
bar(this_ptr, 42, "Finished");

并且在 foo() 函数内部对方法变量的任何引用,例如:

this->status

无非是对指针取消引用变量的引用:

this_ptr->status

因此,您可以看到尝试从this指针访问静态变量将会失败,因为它只是不是该特定内存块的成员。这就是“过去工作”的方式,但我认为解释仍然是一个很好的解释。

希望有帮助!:)

于 2013-09-08T08:33:59.290 回答
0

为什么我们不能使用 $this 或该类的对象访问一个类的静态变量?但是我们可以使用 $this 或该类的对象来访问该类的静态函数。

好吧,我们可以,但是您使用了错误的语法。

错误的:

echo $this->a;

正确的:

$this::$a;

作为c1::$a静态类变量,您需要使用正确的语法,即使用双冒号::,然后使用美元符号 ( $) 来表示变量:$this::$a

但是,不要太容易被该语法所迷惑,因为

$this->f1()

works while c1::f1()is a static function 是因为在 PHP 5 之前的向后兼容性,没有静态类方法(如关键字明确定义的方法static),并且第一个 PHP 5 版本->可用于调用静态类方法。

然而,访问静态类变量$this是 PHP 5.3+ 的语法特性,更新了很多。

示例代码(针对多个 PHP 版本运行):

<?php
/**
 * @link http://stackoverflow.com/a/24059368/367456
 */
class c1
{
    public static function f1()
    {
        return "hello";
    }

    public static $a = 10;

    public function f2()
    {
        echo $this->f1(); // prints "hello"
        echo $this->a;    // Strict Standards: Accessing static property c1::$a as non static
        echo $this::$a;   // prints "10" (PHP <= 5.2.17: Parse error)
    }
}

$obj1 = new c1;
$obj1->f2();
于 2014-06-05T11:46:00.917 回答