【问题标题】:class public variable calls compatible in PHP 7.0 and PHP 5.6 [duplicate]在 PHP 7.0 和 PHP 5.6 中兼容的类公共变量调用 [重复]
【发布时间】:2016-05-06 10:00:18
【问题描述】:

在 PHP 5.6 中:

当在一个类中时,我们通常像这样声明和调用一个公共类变量:

class MyClass
{
    /**
     * @var int
     */
    public $myVar = 0;

    // call it in a public function:
   public function myFunction()
   {
       return $this->myVar;
   }

}

我这样调用函数:

MyClass::myFunction();

在 PHP 7.0 中,该代码会引发致命错误:

不在对象上下文中使用 $this

再次将我的 PHP 版本改回 5.6 后,错误消失了。

问题:

我不得不承认,在阅读手册并从 5.6 更改为 7.0 之后,我不明白。

  1. 我们如何在 PHP 7.0 中声明和调用公共类变量?
  2. 我们如何编写此代码以兼容 5.6 和 7.0?

在 cmets 之后编辑:

那么为什么对非静态方法的静态调用在 5.6 中有效?

【问题讨论】:

  • 你是怎么调用函数的?这很重要。
  • 我很确定您对错误的分析不正确。您显示的代码很好。我同意上述观点,原因是调用所述方法。
  • 它不是静态函数,如果是的话。你的变量不是静态的。
  • php.net/manual/en/migration70.deprecated.php - 对非静态方法的静态调用
  • 它在 5.6 中无法正常工作,但您可能在 5.6 中抑制了消息... 7 使消息更加严格Demo

标签: php class public php-7


【解决方案1】:

我可能正在加载 func() 像这样:

 obj::func();  // Wrong, it is not static method

但也可以

$obj = new Obj();  // correct
$obj->func();

你不能这样调用方法,因为它不是静态方法。

obj::func();

你应该改用:

obj->func();

但是,如果您创建了一个静态方法,例如:

static $foo; // your top variable set as static

public static function foo() {
    return self::$foo;
}

那么你可以使用这个:

obj::func();

【讨论】:

    【解决方案2】:

    您描述的行为可以在以下示例中找到:

    <?php
    
    class MyClass
    {
      /**
       * @var int
       */
      public $myVar = 1;
    
      // call it in a public function:
      public function myFunction()
      {
        return $this->myVar;
      }    
    }
    
    class MyClass2
    {
      /**
       * @var int
       */
      public $myVar = 2;
    
      public function test()
      {
        echo MyClass::myFunction();
        // outputs: 2
      }
    }
    
    
    $obj = new MyClass2();
    $obj->test();
    ?>
    

    在 PHP 5 中,当您在实例中时,您可以调用其他类的公共方法。它将像当前 $this 上下文中的类成员一样工作。 PHP 7 更严格。您可以扩展类或将特征导入到不同继承行的类中。没有必要强化其他类的方法。您仍然可以使用Classname::method()parent::method() 语法来调用祖先的方法。

    【讨论】:

      【解决方案3】:

      您可以通过实例化该类的对象然后调用该类的方法来完成相同的操作。

      class MyClass
      {
          /**
           * @var int
           */
          public $myVar = 0;
      
          // call it in a public function:
         public function myFunction()
         {
             return $this->myVar;
         }
      
      }
      $obj = new Myclass();
      $result = $obj->myFunction();
      print $result;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-04
        • 2014-12-03
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 2016-06-02
        • 2015-07-21
        相关资源
        最近更新 更多