2016-12-15 63 views
0

我有一個Symfony2控制器,我想在其中包含一個包含常用函數的文件。但是,當我使用require語句時,我收到一個錯誤,說明需求是意外的。另外,在PHPStorm中,我還得到一個錯誤,說只有函數可以在我有我的require語句的地方聲明。PHP如何在類的主體中包含代碼,但不包含函數

這裏是我的代碼的概述:

<?php 
namespace AppBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Component\HttpFoundation\Session\Session; 
use Symfony\Component\HttpFoundation\Response; 
use ReCaptcha\ReCaptcha; 

class MyController extends Controller { 

    private $salt_length = 10; 

    private $resources; 
    private $request; 
    private $session; 
    private $message; 
    private $loggedin; 

    /** 
    * @Route("/My/home") 
    */ 
    // 
    // My home page 
    // 
    public function homeAction() { 

     // bla bla 

    } 

    require 'utilities.php'; // <<============== 

} 
?> 

的需要,我的成績結束產生編譯錯誤。

我寧願不創建另一個包和'使用'它,因爲我希望當調用utility.php中的函數時MyController類的作用域有效。

是否有另一個預處理器指令,包含另一個文件的內容來實現我想要做的事情?

奇怪的是,當我查找包括和需要PHP手冊和w3schools PHP頁面似乎說,你可以使用包含/要求做我正在試圖做的。

非常感謝您提供任何幫助的人可以給我這個。

回答

0

您可以在類定義之外放置任何想要的代碼,並在類加載時運行。如果你想包含沒有狀態的非類相關的幫助類型函數,我更喜歡創建一個類的靜態幫助函數而不是全局函數。

要注意:

  • 如果裏面utilities.php是一個實際的一個或多個類,做正確的事,並registier自動加載磁帶機來代替。
  • 使用require_once而不是require

它的混亂,我不建議這樣做,但:

<?php 
    namespace AppBundle\Controller; 

    use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
    use Symfony\Component\HttpFoundation\Session\Session; 
    use Symfony\Component\HttpFoundation\Response; 
    use ReCaptcha\ReCaptcha; 

    require_once 'utilities.php'; // <<============== 

    class MyController extends Controller { 

     .... 
2

什麼,你可能會尋找的特質:

http://php.net/manual/en/language.oop5.traits.php

使用特徵允許您爲班級加載其他功能。

<?php 

namespace AppBundle\Traits; 

trait UtilityTrait { 
    public function doStuff() { 
     return 'stuff'; 
    } 
} 
?> 

<?php 

namespace AppBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Component\HttpFoundation\Session\Session; 
use Symfony\Component\HttpFoundation\Response; 
use ReCaptcha\ReCaptcha; 
use AppBundle\Traits\UtilityTrait; 

class MyController extends Controller { 
    use UtilityTrait; 

    .... 
}