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

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是工厂方法。它用于创建 class 的新实例。其余方法必须 return 对象本身以保持可链接性。此外,通过实施 __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'

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

<?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
?>

有了这个class,你就不必为了得到最终字符串的内容而被迫echo,只需要将它存储在一个变量中,随心所欲地使用。 class 使您能够链接方法,然后调用最后一个 get() 来终止链和 return 最终字符串值。您可以按 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()