静态变量不能通过对象或$this访问,但静态函数可以通过PHP中的$this或对象访问

静态变量不能通过对象或$this访问,但静态函数可以通过PHP中的$this或对象访问,php,Php,为什么我们不能使用$this或该类的对象访问类的静态变量??? 但是我们可以使用$this或该类的对象访问该类的静态函数 这种现象背后的原因是什么?您应该使用self::而不是$this->来访问静态成员 原因是$this引用类的当前实例,而静态成员是类本身的一部分,而不是实例的一部分。您应该使用self::而不是$this->来访问静态成员 原因是,$this引用类的当前实例,而静态成员是类本身的一部分,而不是实例的一部分。静态变量不属于“实例”,而是属于类本身。当您在运行时拥有类的实际“实例

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


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

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


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

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


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

静态变量不属于“实例”,而是属于类本身。当您在运行时拥有类的实际“实例”时,
$this
指针才有意义:它意味着“我现在发现自己就在这个实例中”。。。如何使用$this指针引用实例之外不存在的东西

当我第一次学习C++时,它是用(Meta CoCo,我想)一个系统,它实际上使用了一大堆C预处理器宏来模拟对象,它非常有启发性,因此理解了<代码> $<代码>(<代码>此<代码> C++)实际上只是作为第一个参数传递给所有方法函数的额外参数:

<?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->foo("Hello");
this->bar(42, "Finished");
以及在foo()函数中对方法变量的任何引用,例如:

foo(this_ptr, "Hello");
bar(this_ptr, 42, "Finished");
只不过是对指针未引用变量的引用:

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

希望对你有所帮助!
:)

静态变量不属于“实例”,而是属于类本身。当您在运行时拥有类的实际“实例”时,
$this
指针才有意义:它意味着“我现在发现自己就在这个实例中”。。。如何使用$this指针引用实例之外不存在的东西

当我第一次学习C++时,它是用(Meta CoCo,我想)一个系统,它实际上使用了一大堆C预处理器宏来模拟对象,它非常有启发性,因此理解了<代码> $<代码>(<代码>此<代码> C++)实际上只是作为第一个参数传递给所有方法函数的额外参数:

<?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->foo("Hello");
this->bar(42, "Finished");
以及在foo()函数中对方法变量的任何引用,例如:

foo(this_ptr, "Hello");
bar(this_ptr, 42, "Finished");
只不过是对指针未引用变量的引用:

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

希望对你有所帮助! :)

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

我们可以,但是你用错了语法

错:

this_ptr->status
对:

echo $this->a;
由于
c1::$a
是一个静态类变量,因此需要使用正确的语法,即使用双冒号
,然后使用美元符号(
$
)来表示变量:
$this::$a

但是,不要被这种语法愚弄得太容易,因为

$this::$a;
c1::f1()
是一个静态函数时,由于向后兼容,在PHP版本5之前,没有静态类方法(由显式定义的方法),在第一个PHP 5版本中
->
可用于调用静态类方法

然而,通过
$this
访问静态类变量是PHP5.3+语法特性,更新了很多

示例代码():


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

我们可以,但是你用错了语法

错:

this_ptr->status
对:

echo $this->a;
由于
c1::$a
是一个静态类变量,因此需要使用正确的语法,即使用双冒号
,然后使用美元符号(
$
)来表示变量:
$this::$a

但是,不要被这种语法愚弄得太容易,因为

$this::$a;
c1::f1()
是一个静态函数时,由于向后兼容,在PHP版本5之前,没有静态类方法(由显式定义的方法),在第一个PHP 5版本中
->
可用于调用静态类方法

然而,通过
$this
访问静态类变量是PHP5.3+语法特性,更新了很多

示例代码():


如果您正在寻找PHP中所有不一致的逻辑解释,那就是在浪费时间。@rid:这种情况没有警告。事实上,其他语言(例如C++)也允许以这种方式调用静态函数。“[静态函数]不需要通过其类的对象调用,但为了方便起见,它可能会被调用。”如果您正在寻找PHP中所有不一致性的逻辑解释,您是在浪费时间。@rid:这种情况没有警告。事实上,其他语言(例如C++)也允许以这种方式调用静态函数。“[静态函数]不需要通过