如何在PHP中实现类似$ app-> error() - > encode()的内容?

时间:2016-03-05 21:16:42

标签: php oop

我想在一个类中包含此函数。这个函数基本上json_encode前一个函数的输出(我希望这是有意义的)。

我想做这样的事情:

<?php

$app = new App;

// $app->error(); // Should return ['some error', 'some other error']

echo $app->error()->encode(); // Should return {'errors': ['some error', 'some other error']}.

这个功能的正确用语是什么?我一直在寻找但却无法找到任何东西,因为我并不知道自己在寻找什么。

谢谢!

修改

我认为你错了。这是我以前没有提过的错误。

这只是一个例子。就像在像Slim这样的框架中,您可以执行以下操作:

$response->getBody()->write('Something');

我想做类似的事情。不仅如此。我想了解它是如何完成的。

1 个答案:

答案 0 :(得分:1)

以下是您可以使用的一些样板代码。我们的想法是你应该让错误方法返回另一个类的对象。然后该对象应该具有 encode 方法。

在您的示例中,您希望$app->error()返回一个数组。为了使其表现为数组,我们可以扩展ArrayObject类。

其次,您希望同一个$app->error()公开另一个方法 encode 。所以你在上面提到的那个类中定义了那个方法:

// Extend ArrayObject to make objects behave as arrays
class ErrorMsg extends ArrayObject {
    // Add method to return JSON string
    public function encode() {
        return json_encode(array("errors" => $this->getArrayCopy()));
    }
}

class App {
    private $error;

    public function doSomething() {
        // For demo sake, just set an error:
        $this->error = ["An error occurred in doSomething", "No further info"];
    }

    public function error() {
        // This is the key: instantiate and return another object
        return new ErrorMsg($this->error);
    }
}    

$app = new App;
// Set an error condition in $app
$app->doSomething();
// Loop over error array 
foreach ($app->error() as $index => $error) {
    // Display the error
    echo "Error $index is: $error\n"; 
}
// Display the JSON encoding of the same.
echo $app->error()->encode() . "\n"; 

输出:

  

错误0是:doSomething

中发生错误      

错误1是:没有更多信息

     

{“errors”:[“在doSomething中发生错误”,“没有进一步的信息”]}

eval.in

上查看它

链式方法调用的一般想法

通常,当您希望对象支持链式->表示法时,必须确保将每个方法定义为使用自己的方法返回另一个对象。然后这些方法可以再次返回对象,再次暴露方法等等。所以你可以打开和打开链接。

所以,如果你想写:

$a = new A();
$result = $a->b()->c()->d();

...那么你的代码看起来像这样:

class D {
    // ...
}

class C {
    private $d;
    public function C() { // constructor
        $this->d = new D();
    }
    public function d() {
        return $this->d; 
    }
}

class B {
    private $c;
    public function B() { // constructor
        $this->c = new C();
    }
    public function c() {
        return $this->c; 
    }
}

class A {
    private $b;
    public function A() { // constructor
        $this->b = new B();
    }
    public function b() {
        return $this->b; 
    }
}

当然,这只是结构,您可以将一些特定数据传递给构造函数和/或方法。但主要的想法是你永远不会返回简单类型(String,Number,...),但总是返回对象。