在不使用$ this-> function_name()的情况下调用类函数 - PHP -

时间:2012-01-13 16:00:48

标签: php class

所以我有这个课程:

class A{
      public function do_a(){ return 'a_done';};

      public function do_b(){ return 'b_done';};
}

所以我需要php文件并创建一个类的实例:

require_once("A_class.php");
$System = new A();
require_once("user_calls.php"); //here I import the user file with the function calls.

user_calls.php内容:

echo 'this was the result of '.$System->do_a();
echo 'this was the result of '.$System->do_b();

所以,这确实有效,但我不希望用户必须使用$System->do_a();,而只是do_a();

任何解决方案?

编辑:我还想限制用户可以在user_calls.php文件中调用的函数,基本的本机php函数和A类中的函数。

3 个答案:

答案 0 :(得分:2)

免责声明:虽然此代码有效,并且按照您的要求执行,但这并不意味着我提倡像这样编码。对于其他开发人员来说很难跟上(也许甚至可能在将来......),它也会使用eval(),这几乎总是一件坏事(tm)。那就是说,你走了:

<?php
class A {
    public function do_a() {
        return __METHOD__;
    }

    public function do_b() {
        return __METHOD__;
    }
}

$aRef = new ReflectionClass('A');
$aPublicMethods = $aRef->getMethods(ReflectionMethod::IS_PUBLIC);

foreach ($aPublicMethods as $method) {
    $php = <<<PHP
function {$method->name}() {
    global \$System;
    return \$System->{$method->name}();
}
PHP;

    eval($php);
}

$System = new A();

echo 'this was the result of ' . do_a();
echo 'this was the result of ' . do_b();

请注意,如果您的方法使用参数,事情会变得更加毛茸茸。此外,如果您将任何方法命名为全局命名空间中的函数(例如substr()),则会尝试重新定义它们,并且您可能会收到致命错误。

答案 1 :(得分:0)

类的方法是实例方法(它们作用于$ this定义的类的特定实例)或者它们是类方法(它们不依赖于类的任何一个特定实例,而是提供服务,属于班级的职权范围。

实例方法定义如下:

public function foo()
{
}

而使用STATIC关键字定义类方法。

static public function bar()
{
}

在实例方法中,您可以使用$ this来访问调用该方法的实例的状态。这在类方法中不可用,因为它不依赖于任何一个实例。它可以使用self关键字访问类的其他成员(假设它们不与实例绑定)。

实例方法的调用如下:

$a = new ObjType ()
$output = $a -> foo ();

类方法的调用如下:

$output = ObjType::bar ();

无论使用哪种方法,您都必须提供实例(例如方法)或类(用于类方法)来调用方法。仅调用foo()bar()将无效。

答案 2 :(得分:0)

你必须使用一个闭包。请注意,它直接从类定义调用,而不是对象:

class test {
    function method() {
        echo 'method was called';
    }
}

$method = function(){call_user_func('test::method');};
$method();
$method();
$method();

//output:
//method was calledmethod was calledmethod was called

要从对象而不是类中调用方法,您必须将对象传递给闭包:

class test {
    var $count = 0;
    function method() {
        $this->count++;
        echo $this->count . "|<br />";
    }
}

$obj = new test;
$obj2 = new test;
$method = function($object){call_user_func(array($object, 'method'));};
$method($obj);
$method($obj);
$method($obj);
$method($obj2);
//output:
//1|
//2|
//3|
//1|

但这不是更漂亮或更简单,是吗?

如果您不想弄乱您的页面,只需将对象命名为简短:

$pco = new page_controller_object_with_a_long_name_that_is_annoying;
$pco->do_a();
$pco->do_b();
//etc.