【问题标题】:PHP how methods/functions work within a class objectPHP 方法/函数如何在类对象中工作
【发布时间】:2012-05-09 01:32:17
【问题描述】:

我在 Wordpress 环境中的主题上创建了这个课程。

class Theme {
    function __construct()
    {
       add_action('after_setup_theme', array(&$this, 'do_this'));
    }

    function do_this()
    {
       require_once('helper_functions.php');
    }
}
$theme = new Theme();

在 helper_functions.php 中我有:

function get_image()
{
    return 'working';
}

但现在我很困惑,因为当我执行此操作时

echo $theme->get_image();

它不起作用....但是如果我直接调用它,它会像这样工作:

echo get_image();

但我想既然用的是类方法,就需要用类对象来获取类方法……为什么可以直接调用呢?

【问题讨论】:

    标签: php oop class


    【解决方案1】:

    函数get_image()不是Theme类中设置的函数,它设置在单独的文件中,包含在类中。

    如果你想让它成为类的函数,那么你需要将它写在类文件中,将代码移动到类中。

    您可以使用类扩展的替代方法

    class Helper_functions  {
    
        public function get_image() {
            return "working!";
        }
    }
    

    并将 Theme 类文件更改为

    class Theme extends Helper_functions {
    
        function __construct()
        {
           add_action('after_setup_theme', array(&$this, 'get_image'));
        }
    
    }
    
    $theme = new Theme();
    

    替代方案
    既然您说它是多个文件中的多个函数,您可以在主题类文件或扩展类文件中执行此操作。

    class Theme {
    
        ...
    
        function get_image() { include('theme_file_get_image.php'); }
        function another_function { include('theme_file_another_function.php'); }
    }
    

    【讨论】:

    • 我这样做的原因是因为我有很多函数可以作为方法包含在内,我想将它们组织到单独的文件中,而不是将它们全部声明到一个类中使其难以维护。我想要实现的目标有解决方案吗?谢谢。
    • 如果你真的需要函数成为类的一部分,那么你必须在类中定义它们。如果您绝对想要管理多个文件,请查看我提供的替代答案:)
    • 谢谢你,但我认为这正是我所做的...我只是使用了 require_once 而不是 include...有区别吗?
    • 哦,你得把function get_image() { }去掉,只留下你要执行的代码。那么它应该可以正常工作。
    • 还是helper_functions.php包含很多功能?
    【解决方案2】:

    很明显,你理解错了。 get_image() 在这种情况下,不是一种方法。它只是另一个可以在脚本执行期间调用的普通函数。

    要使其成为方法,您必须在类声明中声明它。

    class Theme 
    {
        function __construct()
        {
           add_action('after_setup_theme', array(&$this, 'do_this'));
        }
    
        function do_this()
        {
           require_once('helper_functions.php');
        }
    
        function get_image()
        {
            return 'working';
        }
    }
    

    阅读更多关于对象和类的信息here

    【讨论】:

    • -好吧,也许你可以帮忙。我这样做的原因是因为我有很多函数要包含在一个方法中,并且我想将它们组织到单独的文件中,而不是将它们全部声明到一个类中,这会使其难以维护。我想要实现的目标有解决方案吗?谢谢。
    【解决方案3】:

    this question 中的答案总结了您在此处看到的结果:

    “包含文件中的代码与函数在同一范围内执行(定义的函数和类是全局的),而不是插入其中,替换那里的其他代码。”

    因此,包含文件中的函数是在全局范围内定义的,这就是对 get_image() 的调用起作用的原因。

    这应该相当于:

    //Include the helper functions
    require_once('helper_functions.php');
    
    class Theme 
    {
        function __construct()
        {
           add_action('after_setup_theme', array(&$this, 'do_this'));
        }
    
        function do_this()
        {
           get_image();
        }
    }
    
    $test = new Theme();
    echo $test->do_this(); //'working';
    

    请注意,get_image() 在全局分数中,不是主题类的成员函数。

    【讨论】:

      【解决方案4】:

      include 和 require 通常被称为“就像将文件内容复制/粘贴”到父脚本中,这似乎是您所期待的。但是,它并不真正正确,这就是为什么你正在做的事情不起作用。

      某些语言具有编译器宏,可以在解释代码之前进行文本替换,这样就可以了。但是,php 没有,并且所有包含语句都在运行时进行评估。在您的情况下,该类在执行该 require 语句之前已完全定义。因此,您只是在执行代码,它定义了一个全局函数。

      【讨论】:

        【解决方案5】:

        您不能拆分类定义。所有这些都需要一口气完成。如果你的班级太大,也许它有太多的责任。

        • 将业务逻辑与工厂逻辑分离(工厂逻辑是实例化新对象的逻辑,业务逻辑那些对象)。
        • 按功能分隔类。
        • 使用继承和多态。

        当您在函数中包含文件时,它只存在于该函数的范围内。意思是你所做的相当于:

        public function do_this() {
            function get_image() { ... }
        }
        

        这并没有真正做任何事情。

        【讨论】:

          猜你喜欢
          • 2010-12-13
          • 1970-01-01
          • 2013-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多