Mam szybkie pytanko - jak do zmiennej w PHP przypisać referencję do klasy (nie do obiektu, tylko do całej klasy), by móc potem odwoływać się do zmiennej i korzystać ze statycznych pól i metod tej klasy?
Takie coś można spokojnie robić w Pythonie:
class A:
pole = "git"
print A.pole
B = A
print B.pole
W PHP może być trudniej... zobacz http://stackoverflow.com/questions/534159/instantiate-a-class-from-a-variable-in-php
Ale ogólnie raczej bym unikał takiego kombinowania. Lepiej przeprojektuj swoje rozwiązanie by działało zgodnie ze sztuką ;)
Chodzi o to, że mam pętlę, która dodaje zapytania na danej klasie. Chciałem mieć coś takiego
$query = MojaKlasa; // jak tutaj przypisać klasę bez tworzenia obiektu?
foreach($table as $item) {
$query->join($item);
}
Da się takie coś uzyskać?
Skąd w pętli będziesz wiedział o jaką klasę chodzi? Mówię o tym "MojaKlasa" - bo jeśli w jakiejś tablicy masz stringi "MojaKlasa","NaszaKlasa","EkstraKlasa" - to będziesz mógł tworzyć obiekty w taki sposób
new $string();
Ew. możesz zainteresować się mechanizmami refleksji (tak się mówi po polsku?? :) ) http://php.net/manual/en/book.reflection.php
Wiecie co? Nie ma to jak konkretny kod i konkretne działanie. Zobaczcie poniżej: (używam Laravela)
Mam takie zapytanie
return CatalogProducts::join(...)->join(...)->join(...)->join(...);
Do funkcji join będę przekazywał parametr z array'a, więc z góry nie wiem ile tych joinów użyć. Stąd też wykombinowałem taką funkcję
public function joinSubtables(array $table_names)
{
$query = null;
foreach ($table_names as $key => $name) {
if ($key == 0) {
$query = CatalogProducts::join($name);
} else {
$query->join($name);
}
}
return $query;
}
Ta pętla wygląda brzydko, bo przy pierwszym wykonaniu muszę przypisać wynik do zmiennej $query, a w kolejnych wywołaniach dopiero robić na niej zapytania. Ewentualnie mogłem zrobić przypisanie przed pętlą, a samą pętlę mógłbym wykonywać od drugiego elementu tablicy. Ale nie w tym rzecz.
Myślałem, że gdyby na samym początku do zmiennej $query jakoś przypisać referencję do klasy CatalogProducts, to może dało by się zrobić to w jednej pętli, np:
$query = CatalogProducts; // jakieś dziwne przypisanie
foreach ($table_names as $name) {
$query->join($name);
}
return $query;
}
Wówczas kod wyglądałby lepiej.
Stąd też moje pytanie o możliwość takiego przypisania do zmiennej $query