将文件内容包含在属性中?

时间:2016-08-05 20:31:37

标签: php

我有一个名为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)

我做错了什么?

2 个答案:

答案 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

,你会发现你所包含的代码不会在类之外运行

简短版:不要这样做