我想在一个类中包含此函数。这个函数基本上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');
我想做类似的事情。不仅如此。我想了解它是如何完成的。
答案 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中发生错误”,“没有进一步的信息”]}
通常,当您希望对象支持链式->
表示法时,必须确保将每个方法定义为使用自己的方法返回另一个对象。然后这些方法可以再次返回对象,再次暴露方法等等。所以你可以打开和打开链接。
所以,如果你想写:
$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,...),但总是返回对象。