Doesn't class design need methods to have a return type?
Perché? Non stai modificando il codice stesso in fase di runtime, quindi il metodo ha un tipo restituito, indipendentemente dal fatto che sia predetto. Solo perché non può essere applicato, non significa che non esista: può essere chiaramente dedotto dal codice stesso.
Doesn't methods signatures have specifically-typed parameters ?
Ancora una volta, non c'è niente da dire che il metodo non possa essere semplicemente liberale in ciò che riceve. Ottieni utente per ID? Certo, passa una stringa o un intero. Come si rompe la programmazione orientata agli oggetti ?
How can OOP techniques help you code in PHP if you have to always check the types of parameters received because the language doesn't enforce types ?
Qui, in base agli argomenti di cui sopra, non riesco ancora a capire perché il "controllo extra", anche se necessario, rende impotenti le tecniche OOP.
Le lingue a caratteri generici che ho familiarità con non hanno sovraccarico del metodo , che viene spesso utilizzato per fare metodi più flessibili sull'input (pur usando sempre lo stesso nome), quindi non vedo molta differenza dall'uso di un metodo e di un "extra check". Uno sviluppatore diligente può scrivere lo stesso metodo, con lo stesso contratto, stabilità e sicurezza in un linguaggio non tipizzato.
When you design things using UML, then code classes in PHP with no return-typed methods and no-type parameters... Is the code really compliant with the UML design ?
Beh, dipende dal tuo stesso metodo, vero? Cosa fa realmente con gli input e cosa emette?
La digitazione esiste ancora
La linea di fondo è che i tipi esistono ancora, sono solo loose o weak 1 , e questi sistemi possono even ha alcuni vantaggi .
In effetti, alcuni IDE come quelli di JetBrains (IntelliJ, PHPStorm) supportano tutti i tipi di digita suggerimento usando PHPDocs per PHP . Come ho usato, fornisce quasi tutti gli avvertimenti convenienti, click-through, completamento del codice, ecc. Che può fornire un IDE per un tipo strongmente tipizzato.
1: Sia "loose" che "weak" sono comunque solo un gruppo scarso; ci sono così tanti diversi tipi di sistemi che questi termini possono causare confusione. Vedi la prospettiva informativa di Eric Lippert su questo argomento su Stack Overflow.
Metodo doc ed esempio in linea
/**
* @static
* @param mixed $id
* @return User
*/
public function getUserById($id) {
....
}
public function printUserName() {
// code completion provided on getName method because of @return
$name = $this->getUserById("5")->getName();
// type hinting for arrays
/** @var User[] $users */
$users = array(new User());
}
Esempio di casting
public function checkUser(User $user) {
if ($user instanceof Administrator) {
/** @var Administrator $admin */
$admin = $user;
$admin->logAccess();
}
}