在PHP中定义类方法

7 php class

是否有可能PHP (as it is in C++)宣布一个class methodOUTSIDEclass definition?

Mic*_*cki 9

不,从PHP 5.2开始.但是,您可以使用__callmagic方法将调用转发给任意函数或方法.

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')
Run Code Online (Sandbox Code Playgroud)

在PHP 5.4中,支持特征.Trait是一种方法的实现,无法将其实例化为独立对象.相反,trait可用于扩展具有包含实现的类.了解更多关于性状这里.


小智 5

是的,可以在定义PHP类之后将其添加到PHP类中.您想使用classkit,这是一个"实验性"扩展.看来默认情况下没有启用此扩展,因此它取决于您是否可以编译自定义PHP二进制文件或加载PHP DLL(如果在Windows上)(例如Dreamhost允许自定义PHP二进制文件,并且它们很容易设置).

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

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);
Run Code Online (Sandbox Code Playgroud)


Sil*_*gon 1

不。

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