PHP如何在类对象中使用方法/函数

时间:2012-04-28 16:08:02

标签: php oop class

我有一个我在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();

但是我想因为我使用的是类方法,所以我需要使用类对象来获取类方法...为什么我能直接调用它?

5 个答案:

答案 0 :(得分:0)

显然,你是以错误的方式理解它。在这种情况下,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的更多信息。

答案 1 :(得分:0)

函数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();

<强>替代
既然你说它是几个文件中的几个函数,你可以在Theme类文件或扩展类文件中执行此操作。

class Theme {

    ...

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

答案 2 :(得分:0)

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()位于全局分数中,而不是是Theme类的成员函数。

答案 3 :(得分:0)

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

某些语言的编译器宏在解释代码之前会进行文本替换,因此会使用wpork。虽然php没有,但所有include语句都是在运行时进行评估的。在您的情况下,在执行require语句之前完全定义了类。因此,您只需执行定义全局函数的代码。

答案 4 :(得分:0)

您无法拆分类定义。所有这一切都需要一气呵成。如果你的班级太大,也许它有太多的责任。

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

在函数内部包含文件时,它只存在于该函数的范围内。这意味着你所做的相当于:

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

哪个什么都没做。