在PHP中定义类方法

时间:2020-03-05 18:55:42  来源:igfitidea点击:

是否可以在PHP(与C ++中一样)中声明类定义之外的类方法?

解决方案

回答

不。

不过,我们可以扩展以前声明的类,如果有帮助的话。

回答

不,从PHP 5.2开始。但是,我们可以使用__call魔术方法将调用转发给任意函数或者方法。

class A {

    public function __call($method, $args) {
        if ($method == 'foo') {
            return call_user_func_array('bar', $args);
        }
    }

}

function bar($x) {
    echo $x;
}

$a = new A();
$a->foo('12345'); // will result in calling bar('12345')

PHP 5.4中支持特征。特性是无法实例化为独立对象的方法的实现。相反,可以使用trait来扩展包含实现的类。在这里了解更多关于性状的信息。

回答

不,这是不可能的。如果在类构造外部定义函数/方法,它将成为全局函数。

回答

我们也许可以重写__call或者__callStatic在运行时查找丢失的方法,但是我们必须组成自己的系统来查找和调用代码。例如,我们可以加载" Delegate"类来处理方法调用。

这是一个示例,如果我们尝试调用$ foo-> bar(),则该类将尝试创建FooDelegate_bar类,并使用相同的参数对其调用bar()。如果我们已经设置了类自动加载功能,则委托可以存放在单独的文件中,直到需要为止。

class Foo {

    public function __call($method, $args) {
        $delegate="FooDelegate_".$method;
        if (class_exists($delegate))
        {
             $handler=new $delegate($this);
             return call_user_func_array(array(&$handler, $method), $args);
        }

    }

}

回答

C ++也无法做到这一点。你把声明和定义混在一起了吗?

回答

不,正如每个人都说过的那样,这是不可能的。

但是,我们可以执行类似的操作来模拟PHP中的mixin或者在运行时将方法添加到类中,这与我们将要获得的效果差不多。基本上,它只是使用设计模式来实现相同的功能。 Zope 3的功能类似于在Python中模拟mixins,这是另一种不直接支持它们的语言。

回答

是的,可以在定义后向PHP类添加方法。我们要使用classkit,它是"实验"扩展。似乎默认情况下未启用此扩展,因此取决于我们是否可以在Windows上编译自定义PHP二进制文件或者加载PHP DLL(例如Dreamhost允许自定义PHP二进制文件,并且它们很容易设置) )。

<?php
class A { }
classkit_method_add('A', 'bar', '$message', 'echo $message;', 
    CLASSKIT_ACC_PUBLIC); 
$a = new A();
$a->bar('Hello world!');

PHP手册中的示例:

<?php
class Example {
    function foo() {
        echo "foo!\n";
    }
}

// create an Example object
$e = new Example();

// Add a new public method
classkit_method_add(
    'Example',
    'add',
    '$num1, $num2',
    'return $num1 + $num2;',
    CLASSKIT_ACC_PUBLIC
);

// add 12 + 4
echo $e->add(12, 4);