2017-08-01 124 views
-3

下面的代碼訪問屬性(不包括命名空間,路由):無法從另一個類

class OneController extends Controller{ 
    public $variable = "whatever"; 
    public function changeVariableAction(){ 
     $this->variable = "whenever"; 
     // any code... 
    $this->redirectToRoute("class_two_route_name"); 
    } 

} 

use AppBundle\Controller\OneController; 
class Two{ 
    public function otherFunctionAction(){ 
    $reference = new One(); 
    return new Response($reference->variable); 
    } 
} 

我爲什麼看到「什麼」而不是「每當」?我知道在執行changeVariableAction()的代碼中沒有行,但是當sb進入匹配class One中此行爲的路由時正在執行?

編輯:

當我寫SF3外我行的方案。

class One{ 
    public $variable = "whatever"; 
    public function changeVariable(){ 
     $this->variable = "whenever"; 
    } 
} 
class Two{ 
    public function otherFunction(){ 
     $reference = new One(); 
     $reference->changeVariable(); 
     echo $reference->variable; 
    } 
} 
    $reference2 = new Two(); 
    $reference2->otherFunction(); 
+3

您創建一個'***'的***新實例***。任何新的實例都會將'$ variable'設置爲'whatever'。你的代碼是這樣說的。 – deceze

回答

0

您看到 「什麼」 而不是 「每當」,因爲這行:通過調用

new One(); 

「新的();」您正在創建類「OneController」的新實例,因此它將設置其默認值「whatever」,因爲函數「changeVariableAction」未在新實例$ reference中調用。

+0

是的,我知道的那一個,但不是進入路線匹配一級時執行的動作?如果沒有,那麼我可以在第二課中執行它嗎? – DeveloperKid

+0

它在路由匹配時執行。問題是當你在類2中創建一個新的實例時,你正在有效地工作在一個尚未被調用函數的類One的新環境中。你可以傳遞你想要設置到第二類的值,並在那裏繼續使用它。或者在第二課中調用的第一課中創建一個「更新」功能並在那裏更新。 – tbrennan

0

經過研究,我可以看到在SF中(因爲它是一個框架),我們不把Action函數當作典型函數(它是關於http等),所以我們不能在另一個類中執行它們。更重要的是,Action函數中的整個代碼不會影響Action函數之外的代碼。獲得新屬性值的唯一方法是通過url中的參數(我不認爲我們想要)發送它們,或者發送到db並從另一個類的數據庫中檢索它。

這裏的證明:

class FirstController extends Controller{ 
    public $variable = "whatever"; 
    /** 
    * @Route("/page") 
    */ 
    public function firstAction(){ 
     $this->variable = "whenever"; 
     return $this->redirectToRoute("path"); 
    } 
} 

class SecondController{ 
    /** 
    * @Route("/page/page2", name = "path") 
    */ 
    public function secondAction(){ 
     $reference = new FirstController(); 
     $reference->firstAction(); 
     return new Response($reference->variable);  
    } 
} 

該代碼給出了一個錯誤:調用上的空成員函數get()方法。

當我刪除行$reference->firstAction();沒有錯誤和「無論」出現(所以原來的)。