Php 如何通过编程更改每个方法以返回$this(预定义列表除外)?
我有一门课:Php 如何通过编程更改每个方法以返回$this(预定义列表除外)?,php,php-5.2,Php,Php 5.2,我有一门课: class Module { public function a(...params...) { //do something, doesn't return anything } public function b(...params...) { //do something, doesn't return anything } public function c(...params...) {
class Module {
public function a(...params...) {
//do something, doesn't return anything
}
public function b(...params...) {
//do something, doesn't return anything
}
public function c(...params...) {
//do something, doesn't return anything
}
public function getAsArray() {
return get_object_vars($this);
}
}
是否可以修改模块类,使方法a()、b()和c()返回$this?我不想在每个函数中都写它。getAsArray()应该返回它所执行的操作。模块将是其他类的基础,我希望此机制在基础中实现,但在继承类中使用它
我想这样使用它:
$module = new Module();
$module->a()->b()->c()->getAsArray();
在某些情况下,我使用此基类:
abstract class FluentInterface
{
public function __call($method, $params)
{
if(substr($method, 0, 3) == 'set')
{
// remove leading 'set' from method
$prop = substr($method, 3);
// lowercase first char
$prop{0} = strtolower($prop{0});
$rc = new ReflectionClass(get_class($this));
if($rc->hasProperty($prop))
{
$this->$prop = $params[0];
return $this;
}
}
return false;
}
}
但它是专门为getter/setter设计的。
也许您可以在特定的问题域上进行一些扩展。如果您不想在每个方法中添加一行返回$this,您可以执行以下操作:
class Module {
private function _a($value) {
echo 'Executing method a<br />';
$this->aVar = $value;
}
private function _b($value) {
echo 'Executing method b<br />';
$this->bVar = $value;
}
private function _c($value) {
echo 'Executing method c<br />';
$this->cVar = $value;
}
public function getAsArray() {
return get_object_vars($this);
}
public function __call($name, $arguments) {
echo 'Calling method '.$name.'<br />';
call_user_func_array(array($this,'_'.$name),$arguments);
return $this;
}
}
$x = new Module();
var_dump($x->a(1)->b(2)->c(3)->getAsArray());
类模块{
私有函数_a($value){
echo“执行方法a
”;
$this->aVar=$value;
}
私有函数(值){
echo“执行方法b
”;
$this->bVar=$value;
}
私有函数c($value){
回显“执行方法c
”;
$this->cVar=$value;
}
公共函数getAsArray(){
返回get\u object\u vars($this);
}
公共函数调用($name,$arguments){
回显“调用方法”。$name.
;
调用_user_func_数组(数组($this,“'.$name),$arguments);
退还$this;
}
}
$x=新模块();
变量转储($x->a(1)->b(2)->c(3)->getAsArray());
虽然这确实比你不喜欢的一行改变要多
请注意,您不能以任何方式将即时方法调用合并到新的模块行中。这实际上需要将实例化的对象存储在变量中,然后将方法调用与该变量链接起来。否
您可以手工操作,也可以编写一个程序来浏览源文件并为您操作。我就是这么想的,但这需要在每个方法定义中添加前缀。这比在每个方法中添加
return$this
要好,但仍然很痛苦。它不是一行,继承类中的每个方法都必须返回$this
,我不想在那里写它。有什么特别的原因不想在每个方法中写一个返回$this吗?这是不必要的代码冗余。如果我不需要,为什么我要写它呢?虽然这不是代码冗余。PHP中任何方法的默认行为都是返回NULL:选择返回任何其他值(包括$this)是必要的,额外的代码。这是必要的,额外的代码,我不希望在一个单独的位置,而不是在每个函数中都有。我不想把它作为一个分支课程。