所以我有这个课程:
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类中的函数。
答案 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.