PHP如何在函数外部的类体中“包含”代码

时间:2016-12-15 01:26:02

标签: php symfony include

我有一个Symfony2 Controller,我想在其中包含一个包含常用功能的文件。但是,当我使用require语句时,我收到一条错误消息,指出require是意外的。另外,在PHPStorm中,我也得到一个错误,说只有函数可以在我的require语句中声明。

以下是我的代码概述:

  <% if object.gender %>
  <%= f.hidden_field(:gender)
  <% else %>
  <div class="form-group row">
    <%= f.label(:gender, :class => "control-label col-xs-4 input-lg") %>
    <div class="col-xs-8">
      <%= f.select( :gender, Dropdown.gender,{:prompt =>"Please Choose"},{class: "form-control input-lg"}) %>
    </div>
  </div>
  <% end %>

我课程结束时的需要产生编译错误。

我宁愿不创建另一个包并“使用”它,因为我希望调用utility.php中的函数时MyController类的范围生效。

是否有另一个预处理器指令确实包含另一个文件的内容以实现我正在尝试做的事情?

奇怪的是,当我查找包含并要求php手册和w3schools php页面似乎说你可以使用include / require完成我在这里尝试做的事情。

提前感谢您提供任何有关此事的帮助。

2 个答案:

答案 0 :(得分:3)

您可能正在寻找的是特质:

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;

    ....
}

答案 1 :(得分:0)

您可以在类定义之外放置您想要的任何代码,它将在加载类时运行。如果你想包含没有状态的非类相关助手类型函数,我更喜欢创建一个静态辅助函数类而不仅仅是全局函数。

注意:

  • 如果utilities.php内部是一个或多个实际的类,请做正确的事情并注册自动加载器。
  • 使用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 {

        ....