Uitandu-ma peste codul scris in php, imi dau seama ca e un lucru care imi lipseste de pe vremea cand lucram in c++, acesta:
int a(int x);
int b(int y);
///////////////////////////////////
int a(int x){
return b(x);
}
int b(int y){
if (x==0)
return 1;
return 0
Inainte sa incepeti, da, stiu ca pot folosi code-folding, dar nu asta este ideea. Mi-se pare ca as avea codul mult mai… clean, daca as putea face ceva de genul in php, dar cautarea pe google nu a dat nici un rezultat. (Si da, e posibil sa nu fi cautat eu ce trebuie…)
In PHP nu conteaza ordinea de definire, insa ce ma interesa pe mine era sa am toate metodele intr-o lista scurta, avandu-le declarate (sa stiu ca exista) dar nu si definite (adica ce anume fac).
Pot face o interfata interfataMagie care sa aiba numele si lista de argumente, fara a avea continutul functiei, apoi sa creez clasa magie care sa extinda interfata anterioara (class magie implements interfataMagie).
Astfel, voi avea lista de functii si argumente (deci declararea functiilor) in interfata, iar codul (definitia) in clasa in sine.
Dacă ăsta e motivul, aș zice că folosești interfețele ușor greșit
Implementarea unei interfețe este ca un contract ce îți garantează că o metodă face ceva, că acceptă un anumit număr de parametri (și de anumite tipuri) și, eventual, că primești un anumit tip de la respectiva metodă (de la php 7+):
interface Foo
{
public function getFoo($foo, \Bar $bar) : int;
}
Pai asta era motivul principal pentru care vroiam ceva de genul, sa fiu sigur ca primeste ce i-am declarat ca primeste. Adaugarea de noi functionalitati incepand de la interfata sau clasa abstracta declarata. Strong-typing-ul ar fi un bonus…
Adica da, stiu ca pot folosi code-folding, dar ma gandeam sa am un fisier cu toate interfetele si clasele abstracte declarate, iar pentru fiecare implementare/extensie de interfata / clasa abstracta, sa am un fisier separat (gen functions.php sa aiba declararea, iar definirea sa fie in fisiere din folderul functions, care este in acelasi folder cu functions.php).
Teoretic as putea avea fisierul respectiv avand declaratiile ca si comentarii, dar as vrea sa introduc un strong-coupling care sa ma ajute sa am totul in ordine. Spre exemplu, daca am un proiect fara teste si vreau sa introduc teste, sa imi fie mai usor, avand lista cu clasele si tipurile de input acceptate. La fel cum un MVC simplifica modificarea structurii existente.
Apropo, ce rol are ace; \Bar din declararea metodei getFoo?
Si care ar fi diferenta dintre urmatoarele doua declarari? (Adica dintre \Bar si Bar…) Pe pagina data nu gasesc sa fie declarat cu backslash la inceput…
public function getFoo( \Bar $bar) : int;
public function getFoo( Bar $bar) : int;
PHP permite namespace-uri (de la 5.3 parcă). Asta înseamnă că poți avea clase definite așa:
//foo/MyFoo.php
namespace foo;
class MyFoo {}
///bar/MyBar.php
namespace bar;
class MyBar {}
///bar/MyBaz.php
namespace bar;
class MyBaz {}
Ca să folosești clasa MyBar în clasa MyBaz, poți doar să o numești ca atare, deoarece sunt în același namespace. Eh, dar dacă vrei să folosești clasa MyFoo în oricare din celelalte clase (sau invers), va trebui să te întorci în „rădăcina” namespace-ului și să specifici tot path-ul: new \foo\MyFoo().
Dacă, de exemplu, ai o clasă fără namespace (gen… nu știu, DateTime), se spune că este în namespace-ul global, fiind accesibilă cu un backslash: \DateTime.
Prin urmare, la typehinting ai nevoie de \Bar doar dacă folosești namespace-uri și dacă Bar este în alt namespace decât cel curent.