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 - 上記の例では、既存のオブジェクト「文字列」。)

メソッド __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 よりも大幅に機能が少ないクラスにラップしています。1 行のコードで既に実行できることを 1 行のコードで実行するために、コードのスタック全体を作成していて、さらに多くのことを実行する能力を制限しています。

たとえば、メソッドがContains()ありStartsWith()ますが、それらは正規表現をまったく処理しません。

そして、連結をどのように処理しますか?変数を文字列に埋め込む場合はどうでしょうか。

PHP には多くの文字列処理機能があり (実際、文字列処理は PHP の強みの 1 つです)、クラスで複製することはできません。

与えられた言語で作業することをお勧めします。構文の理想に強制的に準拠させようとするのではありません。

于 2012-09-04T15:27:06.003 に答える
0

次のように書くことができます。

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

または、新しいキーワードを「コンパイル」したい場合は、次のようにします。

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

お役に立てれば。

于 2012-09-04T15:21:17.233 に答える
0

いいえ、オブジェクトに値を直接割り当てることはできません。PHP では、演算子のオーバーロードとこのスタイルの割り当ては許可されていません。文字列に新しい値を割り当てるには、コンストラクター、invoke、または任意のセッター メソッドを使用する必要があります。

于 2012-09-04T15:19:54.240 に答える