通过使用PHP中的扩展方法来更改输出

时间:2018-08-21 13:18:55

标签: php oop

是否可以在PHP中执行类似的操作?

Image::myMethod(); // returns array
Image::myMethod()->toSring(); // Returns a string built inside the method toString

换句话说,PHP是否有一种方法可以检测该方法是否被另一个方法扩展(如果是),然后返回self/this

2 个答案:

答案 0 :(得分:4)

整理我在评论中的意思,这将在逻辑上为您提供相同的行为,尽管实现细节有所不同:

class Artifact extends ArrayObject {
    public function toString(): string {
        // custom stuff, use ArrayObject api to access underlying data
    }
}

class Image {
    public function myMethod(): Artifact {
        // generate your array data, then:
        return new Artifact($data);
    }
}

答案 1 :(得分:1)

通常这是不可能的。但是您可以通过使用__toString()魔术方法并实现ArrayAccess接口(如果要在循环中使用它,则可以使用Iterator)来实现非常相似的行为。

A,实现可能非常庞大。

class MyClass implements Iterator, ArrayAccess 
{
    ...
    public function __toString() { ... }
    public function current ( ) { ... }
    public function key ( )  { ... }
    public function next ( ) { ... }
    public function rewind ( ) { ... }
    public function valid ( ) { ... }
    public function offsetExists ( $offset ) { ... }
    public function offsetGet ( $offset ) { ... }
    public function offsetSet ( $offset , $value ) { ... }
    public function offsetUnset ( $offset ) { ... }
}

function myFunc()
{
    return new MyClass(...);
}

(string)myFunc() // returns string value
myFunc()[0]  // access as array
foreach (myFunc() as $value) // iterate as array