2015-07-21 13 views
8

Szukałem nowych funkcji dla PHP7 i pomyślałem, że mogę zacząć przygotowywać mój projekt dla nowych wprowadzanych funkcji, takich jak podpowiedź typu skalarnego.Podpowiedź typów i wielu konstruktorów

Jednym z pierwszych problemów, które napotkałem, byli moi konstruktorzy w różnych klasach. Mam pewne ogólne contrustors który działa mniej więcej tak:

public function __construct($data = null) { 
    if (is_numeric($data)) { 
     $this->controller->createById($data); 
    } 
    elseif (is_array($data)) { 
     $this->controller->createByArray($data); 
    } 
    elseif (strlen($data) > 0) { 
     $this->controller->createByUrl($data); 
    } 
} 

Wprowadzenie do typów parametrów dla tej metody będą oczywiście rzucić błędów we wszystkich kierunkach.

O ile wiem, PHP7 nie wprowadza obsługi wielu konstruktorów. Czy są jakieś sposoby na obejście tego problemu, czy jest to jedna z ograniczeń tego języka?

+4

Nie wprowadzaj wskazówek dotyczących tej metody? –

+0

@ N.B. Tak, wiem, że jest taka możliwość, ale pochodząc z tła OOP, bardzo chciałbym, aby cała moja baza kodowa była prawdziwie zorientowana obiektowo;) – OptimusCrime

+0

Programowanie i OOP służą konkretnie do rozwiązywania problemów. Nie masz żadnych problemów, które wymagają rozwiązywania przez programowanie, cierpisz na OCD i teraz błędnie uznałeś to OCD za ograniczenie języka. Niestety, nie jest to ograniczenie języka. To po prostu trochę ciernia w twojej stronie, ponieważ masz jakiegoś głupiego konstruktora, który akceptuje cokolwiek, a teraz chcesz wpisać podpowiedź przez 3 konstruktorów, jaka jest wartość. Czy to naprawdę "OOP"? Złożony, głupi kod, który nie rozwiązuje żadnych problemów? –

Odpowiedz

6

Prawidłowo, to jedna z ograniczeń tego języka. (a strlen() > 0 w każdym razie nie może być sprawdzane za pomocą typu. Z automatycznym odlewane na ciąg ... więc metoda pozwala na wszystko, ale „”, null i fałszywe?)

Generalnie, nie ma RFC w projekcie aby rozwinąć typhinting PHP w 7.1: https://wiki.php.net/rfc/union_types

Pozwoliłoby to napisać int | float | array | string $data = null.

+0

Tak, tak się bałem. Dziękujemy za połączenie rfc dla typów związków. Szkoda, że ​​PHP nie obsługuje wielu konstruktorów, chociaż może to być coś, co pojawi się w przyszłych wersjach teraz, gdy jest bardziej istotne niż wcześniej. W każdym razie, dzięki za jasną odpowiedź na moje pytanie. – OptimusCrime

+1

Funkcja przeciążania (uogólniona wersja wielu konstruktorów) tak naprawdę nie przyjdzie do PHP, ponieważ nie jest możliwe rozwiązywanie konfliktów, szczególnie przy słabym typhintingu (nie ścisłym typie) [lub potrzebowalibyśmy wyrafinowanych reguł, co jest priorytetowe, co po prostu wprawi wszystkich w zakłopotanie ... zwłaszcza, że ​​'declare (strict_types = 1)' jest specyficzne dla wywołującego ... Różne zachowanie dla różnych trybów pisania? wat?!?]. Właśnie dlatego idziemy raczej za przykładem związków, które pozwolą ci co dokładnie robić. – bwoebi

Powiązane problemy