PHP如何在类的主体中包含代码,但不包含函数
问题描述:
我有一个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页面似乎说,你可以使用包含/要求做我正在试图做的。
非常感谢您提供任何帮助的人可以给我这个。
答
您可以在类定义之外放置任何想要的代码,并在类加载时运行。如果你想包含没有状态的非类相关的帮助类型函数,我更喜欢创建一个类的静态帮助函数而不是全局函数。
要注意:
- 如果里面
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 {
....
答
什么,你可能会寻找的特质:
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;
....
}