我有一个名为helper.php
的文件,在这个文件中我有一个函数列表(没有类)。
现在我需要将辅助文件的内容包含到属性中。为此,我创建了一个加载器,这是一个例子:
class Loader
{
function include($helpName)
{
return include $helpName;
}
}
这个Loader被我的班级使用如下:
class Foo
{
function __construct()
{
$this->load = new Loader();
$this->email = $this->load->include('helper.php');
$this->email->send();
}
}
不幸的是我收到了这个错误:
致命错误:在整数
上调用成员函数validate_email()
如果我打印:var_dump($this->email);
我会得到:int(1)
。
我做错了什么?
答案 0 :(得分:2)
除非你在课程结束时专门回来,否则不会那样。来自文档:
处理返回:include失败时返回FALSE并发出警告。除非被包含文件覆盖,否则成功包括返回1。
我会查看autoloading个班级,或者您也可以创建一个班级,并从include.php
返回。
public class Email
{
public function send()
{
echo 'Sending Email';
}
}
return new Email();
自动加载的示例:
//Create Email.php
public class Email
{
public function send()
{
echo 'Sending Email';
}
}
//Main file, set a register, so when it doesn't find a class, it will load from a file, and auto register it.
spl_autoload_register(function ($class_name) {
include $class_name . '.php';
});
class Foo
{
function __construct()
{
$this->load = new Loader();
//If Email class doesn't exist, it will load it from 'Email.php', and then initialize it.
$this->email = new Email();
$this->email->send();
}
}
答案 1 :(得分:0)
包含的代码始终在全局范围内运行。如果您希望将函数合并为类的方法,那么您需要创建一个包含函数的新文件
<?php
Class somename {
?>
和...
<?php
}
但编写自修改代码本质上是危险的。它的丑陋。对于您是否使用?&gt;
明确结束包含的文件,它会很敏感吸收与上面相同的的替代方法是获取已定义函数的列表,并从_call()魔术方法调用这些函数:
Class somename {
public $included;
function _call($fn, $args)
{
return call_user_func_array($this->included[$fn]), $args);
}
}
$obj=new somename();
$before=get_defined_functions();
include('helper.php');
$obj->included=array_diff(get_defined_functions(), $before);
但是如果引用$ this
,你会发现你所包含的代码不会在类之外运行简短版:不要这样做