2016-05-06 63 views
-1

調用兼容在PHP 5.6:類公共變量在PHP 7.0和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的代碼拋出了一個致命的錯誤:

Using $this when not in object context

將我的PHP版本再次更改回5.6後,錯誤消失了。

問題:

我不得不承認,我讀不明白手冊和從5.6到7.0的變化之後。

  1. 我們如何在PHP 7.0中聲明和調用公共類變量?
  2. 我們如何編寫這個代碼以便在5.6和7.0之間兼容?評論後

編輯:

那麼爲什麼在非靜態方法的靜態調用工作在5.6?

+2

你是怎麼調用這個函數的?這很重要。 –

+1

我確定你正在錯誤分析錯誤。你展示的代碼很好。我同意上面的說法,那就是所說方法的調用是原因。 –

+0

增加了函數調用 –

回答

5

In I'm loading maybe func() like this:

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

but can also be

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

你通過instan來完成同樣的任務然後調用該類的對象,然後調用該類的方法。

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; 
1

您所描述的行爲可以在下面的例子中找到:

<?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()語法來調用祖先的方法。