代码之家  ›  专栏  ›  技术社区  ›  dallin

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

  •  0
  • dallin  · 技术社区  · 6 年前

    我正在开发一个定制的PHP框架,在这个框架中,用户在函数中为每个页面封装自己的代码。然后这些函数有望添加到后台的常规页面类中,该类确定如何使用用户定义的函数显示页面。到目前为止,我还无法将用户定义的函数添加到页面类中。

    我在课堂上试过include语句,但正如预期的那样,它不起作用。我曾尝试在类之外包含包含文件,然后将现有的函数添加到实例化对象中,但是我不知道如何将引用现有函数赋给新的对象属性。

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

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

    用户将定义一个页面文件,其中包含每个代码段的函数,例如:

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

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

    理论上,我们可以将这些函数放在Page类之外,让Page类调用它们,但是这些函数仍然需要放在一个类中,因为我们需要一种有效的方法在函数之间传递值。我们的旧框架中的所有现有代码都使用$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 UniqueClassName {
        function ajax() {}
        function action() {}
        function logic() {}
        function css() {<? ?>}
        function html() {<? ?>}
        function js() {<? ?>}
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Felippe Duarte    6 年前

    你可以用 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();
    

    如果需要覆盖trait函数,可以

    class CustomPage {
        use PageFunctions;
    
         public function html() {
             echo "<div>Welcome, <?=$this->userName?>!</div>";
         }
    }
    
    $customPage = new CustomPage();
    $customPage->html(); //output <div>Welcome, username!</div>
    
        2
  •  1
  •   Devon Bessemer    6 年前

    对于ide来说,让用户编写没有类的函数的方法将是非常肮脏的。如果你试图使用 $this 在类上下文之外。

    似乎你让自己很难避免一个用户声明一个类。从一个简短的回顾来看,如果您真的需要将它们封装在一起,那么继承似乎可以解决这个问题。

    为什么不:

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

    这不仅使您能够实例化它们的页面并调用页面类上的任何处理程序,而且还使它们能够在您的页面类中使用预定义的帮助程序。任何不希望公开给用户页的方法/属性都可以设置为private。

    您还可以使页面成为一个抽象类,强制用户正确定义这些方法。