【问题标题】:Using $this inside a static function fails在静态函数中使用 $this 失败
【发布时间】:2011-01-18 04:55:57
【问题描述】:

我有一个我想在其中使用 $this 的方法,但我得到的只是:致命错误:不在对象上下文中使用 $this。

我怎样才能让它工作?

public static function userNameAvailibility()
{
     $result = $this->getsomthin();
}

【问题讨论】:

    标签: php oop this static-methods


    【解决方案1】:

    这是正确的方法

    public static function userNameAvailibility()
    {
         $result = self::getsomthin();
    }
    

    静态方法使用self:: 而不是$this->

    请参阅:PHP Static Methods Tutorial 了解更多信息 :)

    【讨论】:

    • 是的,我正要发布这个答案。
    • 您还应该记住,getsomthin() 方法也必须是静态的 - 您不能在静态方法中调用非静态方法。
    • @Sarfraz,不应该是static:: 而不是self::吗?
    • 有没有办法在 C/C++ 中做类似的事情?
    【解决方案2】:

    您不能在静态函数中使用$this,因为静态函数独立于任何实例化对象。 尝试使函数不是静态的。

    编辑: 根据定义,可以在没有任何实例化对象的情况下调用静态方法,因此在静态方法中没有有意义的使用$this

    【讨论】:

    • 当您尝试将静态变量分配给实例变量时应该有。这不可能吗?
    • self::staticMethod()$self = new self();$self->nonStaticMethod();
    【解决方案3】:

    在静态函数中只能使用 self:: 调用静态函数,如果你的类包含你想使用的非静态函数,那么你可以声明同一个类的实例并使用它。

    <?php
    class some_class{
    function nonStatic() {
        //.....  Some code ....   
        }
     Static function isStatic(){
        $someClassObject = new some_class;
        $someClassObject->nonStatic();
        } 
    }
    ?>
    

    【讨论】:

      【解决方案4】:

      访问器this 引用类的当前实例。由于静态方法不会从实例中运行,因此禁止使用 this。所以这里需要直接调用该方法。静态方法不能访问实例范围内的任何内容,但可以访问实例范围外的类范围内的所有内容。

      【讨论】:

        【解决方案5】:

        很遗憾 PHP 没有显示足够描述性的错误。您不能在静态函数中使用 $this->,如果必须在同一个类中调用函数,请使用 self::

        【讨论】:

          【解决方案6】:

          这是一个以错误方式调用类的方法时发生的情况的示例。执行此代码时您会看到一些警告,但它会起作用并打印:“我是 A:打印 B 属性”。 (在php5.6中执行)

          class A {
              public function aMethod() {
                  echo "I'm A: ";
                  echo "printing " . $this->property;
              }
          }
          
          class B {
              public $property = "B property";
          
              public function bMethod() {
                  A::aMethod();
              }
          }
          
          $b = new B();
          $b->bMethod();
          

          这表明变量$this,在作为静态方法调用的方法中使用,指向“调用者”类的实例。在上面的示例中,A 类中使用了 $this->property,它指向 B 的属性。

          编辑:

          当从对象上下文中调用方法时,伪变量 $this 可用。 $this 是对调用对象的引用(通常是该方法所属的对象,但如果该方法是从辅助对象的上下文中静态调用的,则可能是另一个对象)。 PHP > The Basics

          【讨论】:

            【解决方案7】:

            在静态方法中,属性是针对类的,而不是针对对象的。 这就是为什么无需创建对象就可以访问静态方法或特性的原因。 $this 指的是由一个类组成的对象,但 $self 只指同一个类。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-11-18
              • 2022-01-06
              • 2011-12-28
              相关资源
              最近更新 更多