konto usunięte

Temat: WTF PHP ?

Coś na czym mogą się pastwić wszyscy którzy narzekają na PHP :) Zacznę pierwszy, fajnie będzie jak komentujący będą dodawać własne "znaleziska" zamiast wyskakiwać tu z Pythonem albo inną cholerą ewangelizując wszystkich.

class Safe {
protected $locked = true;

public function __toString() {
return ($this->locked) ? 'Spokojnie, wszystko OK' : 'UWAGA, SEJF JEST OTWARTY';
}
}

class Lockpick extends Safe {

public function unlock(Safe $safe) {
$safe->locked = false;
}

}

$MySafe = new Safe();
$Lockpick = new Lockpick();
$Lockpick->unlock($MySafe);
echo $MySafe;


Wynik ?
UWAGA, SEJF JEST OTWARTY
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: WTF PHP ?

W pelni poprawne dzialanie. JEsli nie chcesz modyfikacji przez klasy pochodne uzyj wezszego modyfikatora dostepu.

konto usunięte

Temat: WTF PHP ?

Gdzie jest WTF?

Dariuszu - trza było to na G+ puścić - większy fun by był :D

konto usunięte

Temat: WTF PHP ?

Piotr Jasiulewicz:
W pelni poprawne dzialanie. JEsli nie chcesz modyfikacji przez klasy pochodne uzyj wezszego modyfikatora dostepu.
Jeśli nawet poprawne, to bardzo nieintuicyjne. Obiekt Safe jest przekazywany jako parametr metody unlock, więc możliwość zmiany jego właściwości protected jest dziwne. Zasłużone WTF.

konto usunięte

Temat: WTF PHP ?

Piotr Jasiulewicz:
W pelni poprawne dzialanie. JEsli nie chcesz modyfikacji przez klasy pochodne uzyj wezszego modyfikatora dostepu.

Wiesz, też widzę w tym jakąś logikę, a moje IDE nawet mi tego nie podkreśla jako błąd ale i tak patrząc na to co zrobił ten kod jakoś mi to nie pasuje.
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: WTF PHP ?

Poprawne w sensnie jezykowym, ale szczerze mowiac tez mi sie nie podoba, powinno wrzucac warning. Oczywiscie calosc calkowicie syntetyczna i nie powinna przejsc jakiegokolwiek review z powodu niepoprawnego dziedziczenia i poleganiu na lamaniu enkapsulacji.

konto usunięte

Temat: WTF PHP ?

Klasa Safe ma parametr locked, chroniony.
Lockpick dziedziczy po klasie Safe, ma dostęp do parametrów publicznych i chronionych tejże klasy.
Po klasie a nie po instancji.
Czyli wszystko gra.

Brzydkie, nieintuicyjne - zgadza się.
Jak dla mnie na WTF to za mało :)

konto usunięte

Temat: WTF PHP ?

Michał Wachowski:
Klasa Safe ma parametr locked, chroniony.
Lockpick dziedziczy po klasie Safe, ma dostęp do parametrów publicznych i chronionych tejże klasy.
Po klasie a nie po instancji.
Czyli wszystko gra.

Brzydkie, nieintuicyjne - zgadza się.
Jak dla mnie na WTF to za mało :)

Owszem ale zauważ że mówimy tutaj o klasach, dziedziczeniu itp. Patrząc z szerszej perspektywy - utworzyłem obiekt który ma chroniony atrybut i mimo tego że jest chroniony, mogę go zmienić "z zewnątrz".

@Piotr twierdzi że powinno nam dać przynajmniej warning. Ja twierdzę że to w ogóle nie powinno być możliwe. Od momentu utworzenia obiektu $locked powinno być chronione i niedostępne spoza tego obiektu.
Tomasz Zadora

Tomasz Zadora programuję

Temat: WTF PHP ?

Takie zachowanie jest jak najbardziej logiczne i pożądane, Lockpick rozszerza Safe więc nie rozumiem zdziwienia. WTF dla mnie byłby wtedy gdyby coś takiego wystąpiło przy określeniu dostępu do zmiennej jako "private".

Podobnie zresztą zachowuje się taki "pro" język jak Java:


package pl.inovum.test;

/**
* Na potrzeby testu.
*
* @author tom
*/
public class Safe
{
protected boolean locked = true;

public String __toString()
{
if (locked) return "Spokojnie, wszystko OK";
else return "UWAGA, SEJF JEST OTWARTY";
}
}

package pl.inovum.test;

/**
*
* @author tom
*/
public class Lockpick extends pl.inovum.test.Safe
{
public void unlock(Safe safe)
{
safe.locked = false;
}
}

package pl.inovum.test;

/**
*
* @author tom
*/
public class SafeTest
{
public static void main(String[] args)
{
Safe safe = new Safe();
Lockpick lockpick = new Lockpick();
lockpick.unlock(safe);
System.out.println(safe.__toString());
}
}


Uruchomienie SafeTest daje dokładnie taki sam wynik jaki jest w PHP.

PS/Edit: czy coś jest intuicyjne czy nie to indywidualna preferencja/gust, o tym się w sumie nie powinno dyskutować jaki kto ma gust, tylko czy jest poprawne z punktu widzenia zasad języka czy nie. Dla mnie to jest np. super intuicyjne i gdyby tak nie było to dla mnie byłby wielki WTF.Tomasz Zadora edytował(a) ten post dnia 20.09.12 o godzinie 15:15
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: WTF PHP ?

@Darek
Zeby osiagnac to co chcesz, przy kazdym wywolaniu interpreter musialby sprwdzac typy + instancje, czyli czy jesli oba typy sa takie same, czy ich instancje sa takie same, przy kazdym wykorzystaniu dziedziczonej wlasciwosci - pomysl sobie ile to checkow w takim ZF zeby orzejsc od index.php do odpowiedzi.

Temu kto wymyslil pola typu public powinni uciac palce - stosujac enkapsulacje nikt nie bedzie mial szans nigdy miec z tym problemu.

konto usunięte

Temat: WTF PHP ?

Piotr Jasiulewicz:
@Darek
Zeby osiagnac to co chcesz, przy kazdym wywolaniu interpreter musialby sprwdzac typy + instancje, czyli czy jesli oba typy sa takie same, czy ich instancje sa takie same, przy kazdym wykorzystaniu dziedziczonej wlasciwosci - pomysl sobie ile to checkow w takim ZF zeby orzejsc od index.php do odpowiedzi.

Temu kto wymyslil pola typu public powinni uciac palce - stosujac enkapsulacje nikt nie bedzie mial szans nigdy miec z tym problemu.

Wiem wiem :) Ot po prostu mi się to nie widzi to się chciałem podzielić.
Andrzej Prażmo

Andrzej Prażmo programista .NET,
właściciel firmy SEE
Software

Temat: WTF PHP ?

W .NET taki zapis:

public void unlock(Safe safe)
{
safe.locked = false;
}

blokowany jest już na etapie kompilacji. Natomiast dopuszcza taki zapis:

public void unlock(Lockpick safe)
{
safe.locked = false;
}

I to jest chyba najrozsądniejsze rozwiązanie. Chcesz zmienić składową chronioną, to rób to z poziomu klasy dziedziczącej, która z zasady taki dostęp posiada.
Tomasz Zadora

Tomasz Zadora programuję

Temat: WTF PHP ?

Bo .NET to java z udziwnieniami Microsoftu, żeby nie było że zrobili kopię języka ;) Pamięta ktoś jeszcze starą awanturę o próbę przywłaszczenia javy przez MS (tzw. "dirty java")? :)
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: WTF PHP ?

.net to platforma a nie jezyk, koledze zapewne o C# chodzilo
Tomasz Zadora

Tomasz Zadora programuję

Temat: WTF PHP ?

Dokładnie, pomyliłem się, chodziło mi o C#.

Temat: WTF PHP ?

Piotr Jasiulewicz:
@Darek
Zeby osiagnac to co chcesz, przy kazdym wywolaniu interpreter musialby sprwdzac typy + instancje, czyli czy jesli oba typy sa takie same, czy ich instancje sa takie same, przy kazdym wykorzystaniu dziedziczonej wlasciwosci - pomysl sobie ile to checkow w takim ZF zeby orzejsc od index.php do odpowiedzi.

Typy i tak są sprawdzane, bo to przecież na ich podstawie interpreter stwierdza czy masz dostęp do pól i metod protected obiektu przekazanego w parametrze, czy nie. Dodatkowe sprawdzenie, czy this i parametr wskazują na to samo miejsce w pamięci aż tak dużym narzutem by nie było.

Tak więc takie zachowanie wynika raczej z celowego działania projektantów języka, którzy ustalili, że atrybuty dostępu będą się odnosiły do klas, a nie do obiektów i konsekwentnie się tego trzymali.

PS. Ten sam trick działa również z polami private (w C# też)
http://ideone.com/CCyzo
Alan Gabriel B.

Alan Gabriel B. Software Engineer,
IFX

Temat: WTF PHP ?

Zyx pisał o tym wieki temu i nawet ładnie wyjasnił.

http://www.zyxist.com/pokaz.php/private_i_obiekty_tej_...

konto usunięte

Temat: WTF PHP ?

Bardziej fuckupy niż WTF

Na wersjach niższych niż php 5.3.4 wywala bardzo bardzo fajne ostrzeżenie, nie można też zdefiniować &offsetGet (poprawili w późniejszych wersjach).

class Foo implements ArrayAccess {
protected $a = array(
0 => 'foo'
);

public function offsetGet($offset) {
return $this->$offset;
}
}

$Foo = new Foo();
$Foo['a'][0] = 'bar';


Inny, ArrayObject, ArrayAcces !== array() a szkoda.

class Foo extends ArrayObject() { }
$Foo = new Foo(array(1,2,3));
asort($Foo); // FAIL
$Foo->asort() // OK


I jeszcze jeden z ArrayObject - nie można przekazać tablicy jako referencji, a szkoda.

$Foo = new ArrayObject($_SESSION);
$Foo['bar'] = 'yada yada';
var_dump($_SESSION);


I na koniec mój ulubiony, wywali się.
Co ciekawsze - usunięcie implementacji interfejsu w Foo lub użycie autoloadera rozwiązuje problem.

namespace bar {
class Bar extends \foo\Foo {}
}

namespace foo {
class Foo implements \yada\Yada {}
}

namespace yada {
interface Yada {}
}

konto usunięte

Temat: WTF PHP ?

Może zaoszczędzę dyskusji i przekieruję na odpowiedni tor:

http://martin-thoma.com/php-a-strange-language/
http://www.phpwtf.org/
http://phpsadness.com/

Nawet jeśli ktoś kocha ten język nad życie powinien te strony obejrzeć - można się dowiedzieć wielu ciekawych rzeczy o tym języku.
Piotr W.

Piotr W. Symfony2 / MongoDB

Temat: WTF PHP ?

Piotr L.:
Może zaoszczędzę dyskusji i przekieruję na odpowiedni tor:

http://martin-thoma.com/php-a-strange-language/
http://www.phpwtf.org/
http://phpsadness.com/

Nie rozumiem dlaczego ktoś tworzy takie serwisy, zamiast odrazu pull request na github'a..

Następna dyskusja:

Narzędzia do PHP




Wyślij zaproszenie do