2016-12-15 2 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'; // <<============== 

} 
?> 

Требовать в конце моего класса вызывает ошибку компилятора.

Я бы предпочел не создавать другой пакет и использовать его, потому что я хочу, чтобы область действия MyController действовала, когда вызываются функции в утилите.php.

Есть ли еще одна директива препроцессора, которая включает в себя содержимое файла в другом, чтобы достичь того, что я пытаюсь сделать?

Как ни странно, когда я смотрю, включите и требуйте, чтобы php-руководство и w3schools php-страницы, похоже, говорили, что вы можете использовать include/require, чтобы сделать именно то, что я пытаюсь сделать здесь.

Благодарим вас за любую помощь, которую кто-то может мне дать.

ответ

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; 

    .... 
}