在 PHP 中,如何将包含文件中的函数添加到现有的 class 或对象实例中?

In PHP, how do you add functions from an include file to an existing class or object instance?

我正在开发一个自定义 PHP 框架,用户可以在其中为每个页面封装他的代码到函数中。然后这些功能将有望添加到幕后的通用页面 class,它决定如何使用用户定义的功能显示页面。到目前为止,我一直无法将用户定义的功能添加到页面 class.

我已经在 class 中尝试了 include 语句,正如预期的那样,它没有用。我试过将包含文件包含在 class 之外,然后将现有函数添加到实例化对象中,但我无法弄清楚如何将对现有函数的引用分配给新对象 属性.

有没有办法从包含文件中获取 PHP 函数列表并将这些函数添加到 class(对象实例化之前)或对象(实例化之后)?

编辑(根据要求提供更多信息):

用户会为每一段代码定义一个包含函数的页面文件,如:

function ajax() {}
function action() {}
function logic() {}
function css() {<? ?>}
function html() {<? ?>}
function js() {<? ?>}

我们计划让这些成为每个页面文件中的唯一代码,PHP 函数之外将没有任何代码。然后,我们希望将这些文件放入一个页面 class 中,它将显示正确的页眉和页脚,根据其所在的代码部分从父 classes 继承,调用这些函数中的每一个以正确的顺序并且仅在适当的情况下,等等

理论上我们可以将这些函数保留在页面 class 之外,让页面 class 调用它们,但是函数仍然需要在 class 中,因为我们需要在函数之间传递值的有效方法。我们旧框架中的所有现有代码都使用 $this 关键字存储值,我们希望保留该关键字以简化向新框架的过渡。例如

function logic() {
    $this->userName = $db->getValue("SELECT user_name FROM users WHERE id=" . $_SESSION['user_id']);
}

function html() {<? 
    <div>Welcome, <?=$this->userName?>!</div>
?>}

理想情况下,我们可以将文件保留为函数列表。如果没有办法做到这一点,下一步将是要求每个页面文件将所有函数包装在它自己的 class 中,然后将那个 class 注入页面 class,但这并不像我们希望实现的那样干净。例如:

class UniqueClassName {
    function ajax() {}
    function action() {}
    function logic() {}
    function css() {<? ?>}
    function html() {<? ?>}
    function js() {<? ?>}
}

您让用户在没有 class 的情况下编写函数的方法对于 IDE 来说是极其肮脏的。如果您尝试在 class 上下文之外使用 $this,大多数 IDE 会左右抱怨。

看来您只是为了避免让用户声明 class 而让自己变得困难。从简短的回顾来看,如果你真的需要将它们封装在一起,继承似乎真的适用于此。

为什么不呢:

class UserPage extends Page {
    function ajax() {}
    function action() {}
    function logic() {}
}

这不仅让您能够实例化他们的页面并调用您在页面上的任何处理程序 class,而且还让他们能够在您的页面中使用预定义的帮助程序class。任何您不想向 UserPage 公开的 method/property 都可以设置为私有。

您还可以将页面抽象化class,强制用户正确定义这些方法。

您可以使用Traits

trait PageFunctions {

    public function ajax() {}
    public function action() {}
    public function logic() {}
    public function css() {<? ?>}
    public function html() {<? ?>}
    public function js() {<? ?>}
}

class Page {
    use PageFunctions;
}

$page = new Page();
$page->js();

如果你需要覆盖一个特征函数,你可以

class CustomPage {
    use PageFunctions;

     public function html() {
         echo "<div>Welcome, <?=$this->userName?>!</div>";
     }
}

$customPage = new CustomPage();
$customPage->html(); //output <div>Welcome, username!</div>