konto usunięte

Temat: Jeszcze jeden powód, z którego PHP sucks

Niekiedy się zdarza, że jakaś metoda musi wiedzieć, jak nazywa się jej klasa. Napr., ORM może z nazwy klasy wygenerować nazwę tablicy lub coś jeszcze takiego. I wszystko jest okej do pory, gdy chcemy dowiedzieć się nazwę klasy w kontekście statycznym. To znaczy:


<?php
class MyParentClass {
public static function munchName() {
return strtolower(get_class()); // myparentclass
}
}

class MyChildClass extends MyParentClass {
}

echo MyChildClass::munchName(); // myparentclass... WTF?!


Więcej tego, gdy próbujesz jakoś to obejść przy pomocy get_class(new self()), to wszystko jedno nic nie wyjdzie, ponieważ metoda statyczna jest odpalana w kontekście klasy, w której ją zadeklarowano.

No i na deser. O tej przykrości jest bugreport, jednakże na nim padła rezolucja, że nie będą nic tam poprawiać, bo to okazuje się zbyt skomplikowane...

No i traktuj po czymś takim (a takich błędów architekturalnych mają dużo więcej) PHP poważnie. Zabawkowy język, zabawkowe OOP, zabawkowy dynamizm.Jarosław Fedewicz edytował(a) ten post dnia 23.06.10 o godzinie 13:40

konto usunięte

Temat: Jeszcze jeden powód, z którego PHP sucks

Wnioskuje że chodzi Ci o Late Static Binding.

ps. dostępne od v5.3

konto usunięte

Temat: Jeszcze jeden powód, z którego PHP sucks

Józef Tomasz B.:
Wnioskuje że chodzi Ci o Late Static Binding.

ps. dostępne od v5.3

Mam PHP 5.3; właśnie że get_class() nie jest tam poprawiony i nie będzie. W production będzie jednak 5.2.

Kurcze, dlaczego w Pythonie mogli zrobić self.__class__.__name__ i nic to im nie kosztowało?Jarosław Fedewicz edytował(a) ten post dnia 23.06.10 o godzinie 13:53

konto usunięte

Temat: Jeszcze jeden powód, z którego PHP sucks

ja to rozwiązałem tak:

class A {
protected $name ='';
public function __construct ($class ) {
$this->name = get_class($class);
}
}

class B extend A {
public function __construct() {
parent::__construct($this);
}
}


czy to dobre rozwiązanie - nie mam pojęciaPrzemysław R. edytował(a) ten post dnia 23.06.10 o godzinie 14:02

konto usunięte

Temat: Jeszcze jeden powód, z którego PHP sucks

Jarosław Fedewicz:
Niekiedy się zdarza, że jakaś metoda musi wiedzieć, jak nazywa się jej klasa. Napr., ORM może z nazwy klasy wygenerować nazwę tablicy lub coś jeszcze takiego. I wszystko jest okej do .... CIACH :)

Czemu programujesz w jezyku ktory Ci sie nie podoba ?Paweł Krefta edytował(a) ten post dnia 23.06.10 o godzinie 14:08

konto usunięte

Temat: Jeszcze jeden powód, z którego PHP sucks

Płacą mi za to :-)

konto usunięte

Temat: Jeszcze jeden powód, z którego PHP sucks

Przemysław R.:
ja to rozwiązałem tak:
... ciach

Czytamy uważnie — chodzi o kontekst statyczny, gdy nie ma żadnego „$this”.

Temat: Jeszcze jeden powód, z którego PHP sucks

.Krzysztof Korzeniewski edytował(a) ten post dnia 24.06.10 o godzinie 11:01
Rafał Korszuń

Rafał Korszuń co-owner @ Kleder

Temat: Jeszcze jeden powód, z którego PHP sucks

skoro masz 5.3 to czemu nie używasz __STATIC__ ??

<?php

// With __STATIC__ keyword. (Would be better.)
class Model
{
public static function find()
{
echo __STATIC__;
}
}

class Product extends Model {}

class User extends Model {}

Product::find(); // "Product"
User::find(); // "User"
?>
Rafał K. edytował(a) ten post dnia 23.06.10 o godzinie 14:28

konto usunięte

Temat: Jeszcze jeden powód, z którego PHP sucks

Rafał K.:
skoro masz 5.3 to czemu nie używasz __STATIC__ ??
Jarosław F.
W production będzie jednak 5.2.
Rafał Korszuń

Rafał Korszuń co-owner @ Kleder

Temat: Jeszcze jeden powód, z którego PHP sucks

no to zostaje sztuczka z debugtrackiem
<?php
class A {
function showclass() {
$backtrace = debug_backtrace();
echo $backtrace[0]['class'];
}
}

class B extends A {}
?>
Rafał K. edytował(a) ten post dnia 23.06.10 o godzinie 14:37

konto usunięte

Temat: Jeszcze jeden powód, z którego PHP sucks

Rafał K.:
no to zostaje sztuczka z debugtrackiem

Nie zostaje :-)


<?php

class A {
public static function getClassName() {
$tr = debug_backtrace();
return $tr[0]['class'];
}
}

class B extends A {
}

printf("A: %s\n", A::getClassName());
printf("B: %s\n", B::getClassName());



Uruchamiasz, otrzymujesz:

A: A
B: A


I tyle tego bektrejsu...

konto usunięte

Temat: Jeszcze jeden powód, z którego PHP sucks

Oczywiście to widziałeś?

http://www.php.net/manual/en/function.get-class.php

W komentarzach masz dokładnie to czego szukasz, chociaż po ich liczbie wnioskuję, że nie wszystkie działają...
Rafał Korszuń

Rafał Korszuń co-owner @ Kleder

Temat: Jeszcze jeden powód, z którego PHP sucks

działa zobacz: http://www.php.net/manual/en/function.get-called-class...
tam jest implementacja get_called_class dla php < 5.3.0 opartej na bt

działa na pewno na 5.2.5

konto usunięte

Temat: Jeszcze jeden powód, z którego PHP sucks

Jarosław Fedewicz:
Józef Tomasz B.:
Wnioskuje że chodzi Ci o Late Static Binding.

ps. dostępne od v5.3

Mam PHP 5.3; właśnie że get_class() nie jest tam poprawiony i nie będzie. W production będzie jednak 5.2.

get_class nie bedzie tam poprawiony poki co (down dep?)

pojawila sie natomiast nowa funkcja ktora moze Cie zainteresowac

http://pl.php.net/get_called_class
Kurcze, dlaczego w Pythonie mogli zrobić self.__class__.__name__ i nic to im nie kosztowało?

:-)

frustracja to strata czasu
wszystko ma przyczyne i logike, wystarczy sie zastanowic

pomijajac fakt, ze robienie czegos czego sie nie lubi ... za pieniadze ... brzmi brzydko ;-)

pozdr

konto usunięte

Temat: Jeszcze jeden powód, z którego PHP sucks

Z czystej ciekawości:

1. jak ten kod wyglądałby w pythonie?
2. w jakim celu potrzebna Ci w ogóle taka konstrukcja?

konto usunięte

Temat: Jeszcze jeden powód, z którego PHP sucks

Mateusz J.:
Z czystej ciekawości:

1. jak ten kod wyglądałby w pythonie?

class A:
@classmethod
def getName(cls):
return cls.__name__

class B(A):
pass

print "A: %s" % (A.getName())
print "B: %s" % (B.getName())


Uruchamiasz, otrzymujesz:

A: A
B: B

2. w jakim celu potrzebna Ci w ogóle taka konstrukcja?

Naprzykład, ORM ma dwie klasy: jedna reprezentuje zapis w tablicy, inna — kolekcję takich zapisów. By convention klasy nazywają się w kształcie Entity/EntityCollection.

Gdyby get_class() działało jak trzeba, miałbym po metodzie odpowiednio getCollection()/getEntity() w klasie bazowej, uruchamiane statycznie bez potrzeby mieć pod ręką egzemplarz obiektu.

O ileż jest to niemożliwe, muszę się odmówić albo od statyki i komplikować wykorzystujący te klasy kod, albo komplikować klasy przy pomocy tricków (np. public static $__class__ = __CLASS__; lub coś w tym rodzaju we wszystkich nowych klasach), wykonywanych dla _każdej_ takiej klasy zamiast raz na zawsze. Don't Repeat Yourself, eh?

konto usunięte

Temat: Jeszcze jeden powód, z którego PHP sucks

pojawila sie natomiast nowa funkcja ktora moze Cie zainteresowac

W PHP 5.3, niestety.

konto usunięte

Temat: Jeszcze jeden powód, z którego PHP sucks

a może by tak zrobić:

get_class($this);

wtedy będzie zwracać poprawnie :)

konto usunięte

Temat: Jeszcze jeden powód, z którego PHP sucks

Jarosław Fedewicz:

O ileż jest to niemożliwe, muszę się odmówić albo od statyki i komplikować wykorzystujący te klasy kod, albo komplikować klasy przy pomocy tricków (np. public static $__class__ = __CLASS__; lub coś w tym rodzaju we wszystkich nowych klasach), wykonywanych dla _każdej_ takiej klasy zamiast raz na zawsze. Don't Repeat Yourself, eh?

ORM generują kod więc DRY tutaj nie wchodzi w grę. W propelu i chyba doctrine nazwy klas dla encji lub kolekcji są jako stałe klasy, możliwe też że jest to szybsze niż wywoływanie jakiejkolwiek funkcji.



Wyślij zaproszenie do