1

我编写了一些类来使用 C# 中的字符串。

这里是:

class String {

        private $origin_string = null;
        private $result_string = null;

        function __construct($string)
        {
            $this->origin_string = $string;
            $this->result_string = $this->origin_string;
        }

        public function Trim()
        {
            $this->result_string = Trim($this->result_string);
            return $this->result_string;
        }

        public function StartWith($string)
        {
            return (substr($this->result_string, 0, strlen($string)) === $string);
        }

        public function EndWith($string)
        {
            $endlen = strlen($string);
            $strlen = strlen($this->result_string);
            return (substr($this->result_string, $strlen - $endlen, $endlen) === $string);
        }

        public function Contains($string) {
            return (strpos($this->result_string, $string) !== false);
        }

        public function Replace($search, $string) {
            $this->result_string = str_replace($search, $string, $this->result_string);
            return $this->result_string;
        }

        public function __invoke($string) {
            $this->origin_string = $string;
            $this->result_string = $this->origin_string;
            return $this;
        }

        public function __toString()
        {
            return $this->result_string;
        }

        public static function Override($string)
        {
            return new self($string);
        }

    }

正在使用:

$s = new String("My custom string");

if ($s->StartWith("My"))
    $s->Replace("custom", "super");

print $s; // "My super string"

为了更正从对象打印我的文本,我使用魔术方法 __toString()。

问题: 有没有一种方法,逆__toString?这样我们就可以写:

$s = "new text";

并且该行被分配给对象内的变量。

($s - 上例中的现有对象“String”。)

方法 __set 的类似物,仅与对象有关,与其中的变量无关。

在使用 __invoke 时,但这并不是我想要的。

4

4 回答 4

3

不。

$s = "new text";将(原生 PHP)字符串分配给"new text"变量$s. 它会覆盖$s之前的任何内容。$s如果$s是一个对象,它不会调用任何方法。

你必须改变 PHP 的核心行为来实现类似的东西。您将始终必须显式调用String对象上的方法。

于 2012-09-04T15:19:04.610 回答
2

对您的直接问题的简短回答是“不,在 PHP 中没有任何方法可以做到这一点”。

字符串是 PHP 中的一种原始数据类型,它不执行运算符重载或启用此类事情所需的任何其他功能。

而且,因为它们是原始数据类型,所以没有必要将它们封装在这样的对象结构中。PHP 的 OO 功能在最近的版本中取得了长足的进步,但从本质上讲,它仍然不是一种完全的 OO 语言。

事实上,我会说你正在做的事情适得其反。您将字符串的概念包装到一个功能比基本 PHP 少得多的类中。您正在编写一整套代码,以便在一行代码中完成已经可以在一行代码中完成的事情,并且您限制了做更多事情的能力。

例如,你有Contains()andStartsWith()方法,但它们不以任何方式处理正则表达式。

你将如何处理连接?那么将变量嵌入字符串呢?

PHP 有很多字符串处理功能(事实上,字符串处理是它的强项之一),您的类将无法复制这些功能。

我建议使用您所获得的语言,而不是试图强迫它符合您的语法理想。

于 2012-09-04T15:27:06.003 回答
0

不,您不能直接为您的对象赋值。PHP 不允许运算符重载和这种样式赋值。您必须使用构造函数、调用或任何 setter 方法为字符串分配新值。

于 2012-09-04T15:19:54.240 回答
0

你可以这样写:

$s = 'myclass';
$o = new $s();

或者,如果您想“编译”新关键字,您可以这样做:

$s = '$x = new myclass();';
eval($s);

希望这可以帮助。

于 2012-09-04T15:21:17.233 回答