2010-03-06 14 views
6

Hai. Tworzyłem tę prostą klasę ciągów i zastanawiałem się, czy jest to bardziej naturalny sposób robienia tego.Jak zrobić naturalną klasę String w PHP

class Str{ 
    function __construct($str){ 
     $this->value = $str; 
     $this->length = strlen($str); 
     .. 
    } 

    function __toString(){ 
     return $this->value; 
    } 
    .. 
} 

więc teraz muszę używać go tak:

$str = new Str('hello kitty'); 
echo $str; 

Ale to nie robi wyglądać bardzo „naturalny” w nawiasach. Więc zastanawiałem się, czy coś podobnego lub podobnego było możliwe.

$str = new Str 'hello kitty'; # I dont believe this is possible although this is preferred. 

$str = new Str; # get rid of the construct param. 
$str = 'value here'; #instead of resetting, set 'value here' to Str::$value?? 

W drugiej metodzie, czy istnieje sposób mogę ewentualnie złapać tej zmiennej Bing ustawiony ponownie i zamiast resetowanie go, ustaw na ul :: $ wartość? Zastanawiałem się nad tym i najbliżej, do którego mogłem dojść, to metoda __destruct. ale nie było możliwości dowiedzenia się, jak został zniszczony. Czy to możliwe, czy marnuję swój czas?

+21

Tracisz czas. :-) –

+1

To, co robisz, to w zasadzie klasa otoki.Jedną z różnic, które znajdziesz w Javie, jest autoboxing (ciąg automatycznie uznawany za ciąg) i jest to funkcja językowa. To, co próbujesz tutaj zrobić, faktycznie modyfikuje składnię. –

Odpowiedz

8

Ponieważ PHP jest luźno wpisane, nie ma naturalny klasa ciąg, ponieważ w naturalny sposób korzystania z ciągów jest dobrze, tylko o ich użyciu. Jednak od PHP5.3 jest przedłużeniem w SPL, który zapewnia silnie wpisane skalary:

jednak pamiętać, że to rozszerzenie jest oznaczone jako eksperymentalne i mogą ulec zmianie. Od tej pory nie jest również dostępny w systemie Windows.

Można również spróbować https://github.com/nikic/scalar_objects

Rozszerzenie wprowadza możliwość zarejestrowania klasę, która obsługuje metody wywołania pewnego prymitywnego typu ciąg, array (...). W związku z tym umożliwia implementowanie interfejsów API, takich jak $ str-> length().

+0

wygląda na to, że muszę poczekać ... – shxfee

0

Obawiam się powiedzieć, że nie będziesz miał szczęścia z żadnym z nich.
$str = new Str 'hello kitty'; zakończy się błędem krytycznym i chociaż druga metoda jest prawidłowa, nie robi tego, co zamierzamy, ale zmienia przypisanie natywnego ciągu znaków.

Czy mogę zapytać, dlaczego chciałbyś mieć opakowanie jednostkowe typu natywnego?

+0

tak ... nie miałem szczęścia z żadnym z nich, dlatego pytanie. Interesuje mnie to, aby moje skrypty były trochę silnie wpisane ... ciąg powinien być łańcuchem a nie liczbą całkowitą w połowie skryptu. – shxfee

2
  1. Nie można wywoływać funkcji w PHP bez nawiasów.
  2. Twoja następna metoda zmieni odniesienie do ciągu znaków.

Dlaczego to nie wygląda dla ciebie naturalnie? Tak samo jest w Javie.

Można znaleźć to przydatne:

php-string