知道在phpoop中结束方法链接的意义


know the point of ending the method chaining in php oop

你能帮我吗?

请告诉我结束这条链条的意义?

例如:

class A {
     // some static function
}
A::string()->hash() // return 'abcd'
A::string()->hash()->replace('a','z') // return 'zbcd'
A::string()->hash()->replace('a','z')->sub(0,2) // return 'zb'

如何编写函数?

静态方法string是一个工厂方法。它用于创建类的新实例。其余的方法必须返回对象本身以保持可链接性。此外,通过实现__toString方法,可以将对象打印或连接到字符串。

class A {
    protected $string;
    public function __construct($string = null)
    {
        $this->string = $string;
    }
    public static function string($string = 'abcd')
    {
        return new self($string);
    }
    public function hash()
    {
        return $this;
    }
    public function replace($search, $replace)
    {
        $this->string = str_replace($search, $replace, $this->string);
        return $this;
    }
    public function sub($start, $count)
    {
        $this->string = substr($this->string, $start, $count);
        return $this;
    }
    public function toString()
    {
        return $this->string;
    }
    public function __toString()
    {
        return $this->toString();
    }
}
echo A::string()->hash(); // prints 'abcd'
echo A::string()->hash()->replace('a','z'); // prints 'zbcd'
echo A::string()->hash()->replace('a','z')->sub(0,2); // prints 'zb'

您可能希望通过链接任意多个方法来对输入字符串执行不同的操作。然后,您可以有一个方法,当被调用时,该方法将返回操作后字符串的最终内容。您可能希望将此操作的结果存储在变量中,而不必将其回显到浏览器。以下是实现的方法

<?php
class A {
    /**
    *@var string The string to manipulate
    */
    private static $string;
    /**
    *This method replaces parts of a string with another string value.
    *@param string $string The string whose content is to be searched and replaced
    *@param string $search The string to search for in the $string
    *@param string $replace The string to replace with the $search string
    *@param 'Object This static class
    */
    public static  function replace($string = null, $search, $replace)
    {
        //check if input string is provided and set the value of the string property
        if($string !== null) self::$string = $string;
        //evaluate and set the value of the string property
        self::$string = str_replace($search, $replace, self::$string);
        //return this static class
        return new static;
    }
    /**
    *This method returns part of the string.
    *@param string $string The string whose part is to be returned
    *@param int $start Where to start truncating from
    *@param int $count The number of characters to return from the starting point
    *@param 'Object This static class
    */
    public static  function sub($string = null, $start, $count)
    {
        //check if input string is provided and set the value of the string property
        if($string !== null) self::$string = $string;
        //evaluate and set the value of the string property
        self::$string = substr(self::$string, $start, $count );
        //return this static class
        return new static;
    }
    /**
    *This method returns the final string after manipulation.
    *@param null
    *@return string The value of $string property
    */
    public static function get()
    {
       //return the contents of the string property 
       return self::$string;
    }
}
//here are the options you can have
$string = A::replace($string, $search, $replace)->sub($start, $count)->get(); //replace, get substring and return string
$string = A::replace($string, $search, $replace)->get(); //replace and return string
$string = A::sub($string, $start, $count)->replace($search, $replace)->get(); //get substring, replace and return string
$string = A::sub($string, $start, $count)->get(); //get substring and return string
?>

有了这个类,就不必为了获得最后一个字符串的内容而强制使用echo,只需将其存储在一个变量中并根据需要使用即可。该类使您能够链接方法,然后调用最后一个get()来终止链接并返回最终的字符串值。您可以按任何顺序调用方法A::replace()->sub()->get()A::sub()->replace()->get(),调用get()作为最后一个终止链。您只需要在调用的第一个方法中传递$string值一次,它的值将保留给其他链接方法。例如,您可以执行A::replace($string, $search, $replace)->sub($start, $count)->get()A::sub($string, $start, $count)->replace($search, $replace)->get()