代码之家  ›  专栏  ›  技术社区  ›  jnbdz

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

  •  4
  • jnbdz  · 技术社区  · 6 年前

    在PHP中可以这样做吗?

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

    所以,换句话说,有没有一种方法可以让PHP检测该方法是否被另一个方法扩展,如果是,它会返回 self/this ?

    2 回复  |  直到 6 年前
        1
  •  4
  •   bishop    6 年前

    将我在注释中的意思编纂成代码,这将在逻辑上为您提供相同的行为,尽管实现细节不同:

    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);
        }
    }
    
        2
  •  1
  •   Alex    6 年前

    一般来说,这是不可能的。但是,您可以通过生成uToString()magic方法和实现arrayaccess接口(如果您想在循环中使用它,还可以使用迭代器)来实现非常类似的行为。

    唉,实现可能相当庞大。

    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