Temat: WTF PHP ?

Piotr Walków:
Nie rozumiem dlaczego ktoś tworzy takie serwisy, zamiast odrazu pull request na github'a..

A Ty od razu napierasz z pull requestami? Zmalezienie błędu jest banalne - często dzieje się przypadkiem, poprawienie wymaga znajomości technologii od środka, znajomości konwencji, testów etc. Albo nie robiłeś tego nigdy, albo po prostu trollujesz....

konto usunięte

Temat: WTF PHP ?

Piotr Walków:
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..

Też nad tym się zastanawiałem, dopóki ktoś mi nie wytłumaczył że poniższe to prawidłowe działanie PHP i że trzeba by zmienić założenia języka żeby to "poprawić":

http://phpsadness.com/sad/47

konto usunięte

Temat: WTF PHP ?

Piotr L.:
http://phpsadness.com/sad/47

A ktoś w PHP używa == poza sytuacjami gdzie konwersja typów która się przy tym dzieje jest mu na rękę ?
Piotr W.

Piotr W. Symfony2 / MongoDB

Temat: WTF PHP ?

Łukasz Sarnacki:
Piotr Walków:
Nie rozumiem dlaczego ktoś tworzy takie serwisy, zamiast odrazu pull request na github'a..

A Ty od razu napierasz z pull requestami? Zmalezienie błędu jest banalne - często dzieje się przypadkiem, poprawienie wymaga znajomości technologii od środka, znajomości konwencji, testów etc. Albo nie robiłeś tego nigdy, albo po prostu trollujesz....

Jeśli widzę błąd w bibliotece, z której korzystam posiada zawężenie możliwości i w własnej instancji coś poprawiłem - to pewnie, że robię lub zlecam pull request.

konto usunięte

Temat: WTF PHP ?

Piotr L.:
Też nad tym się zastanawiałem, dopóki ktoś mi nie wytłumaczył że poniższe to prawidłowe działanie PHP i że trzeba by zmienić założenia języka żeby to "poprawić":
Albo się po prostu douczyć, a nie wynajdować dziury w całym.

konto usunięte

Temat: WTF PHP ?

Dariusz Półtorak:
Piotr L.:
http://phpsadness.com/sad/47

A ktoś w PHP używa == poza sytuacjami gdzie konwersja typów która się przy tym dzieje jest mu na rękę ?

Nie znam przypadku w którym ten przykład byłby komuś na rękę.
Zwłaszcza że nawet jeśli oba ŁAŃCUCHY są konwertowane do liczb to liczby te nie są równe.
Dla mnie to ewidentny bug. Ale na podanych stronach jest tego dużo więcej...

BTW, wiem dlaczego tak się dzieje, nie wiem tylko jak można uznać to za "feature"...Piotr L. edytował(a) ten post dnia 24.09.12 o godzinie 16:14

Temat: WTF PHP ?

A ja właśnie przeczytałem, że operator == jest nieprzechodni :)

To znaczy: "foo" == 0 ^ "foo" == True ^ 0 != True.

To też jest zamierzone działanie? Bo jak dla mnie, to upośledzona logika, która początkujących może przyprawić o ból głowy i wymusić szukanie błędu.

Rozumiem potencjalną wygodę przy konwersji typów, ale jednak tutaj już lekko przegięli. Zgodnie ze wszelką logiką równość jest relacją przechodnią, ale PHP widać ma gdzieś powszechnie uznaną logikę i tworzy własną.

Domyślam się, że to zamierzone działanie, ale jednak nieco przesadzili.

Ja np. jako PHP newbie (a w zasadzie ktoś, kto w ogóle nie pisze w PHP) pogubiłbym się w tym kompletnie.
Andrzej Prażmo

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

Temat: WTF PHP ?

Paweł S.:
A ja właśnie przeczytałem, że operator == jest nieprzechodni
Operatorów w PHP, to generalnie lepiej unikać. Klasyka:

$x = 1.7;
$y = 1.9;
$a = $x + 0.1;
$b = $y - 0.1;
if($a == $b)
echo "a i b są takie same";
else
echo "a i b są różne";

Powodem takiego zachowania jest oczywiście brak typu decimal. Problem rozwiązano w tradycyjny dla tego języka sposób, czyli do istniejących 500 tys. funkcji dodano następne (bcadd, bcsub, itd.).
Łukasz Mordawski

Łukasz Mordawski Programista PHP

Temat: WTF PHP ?

Paweł S.:
A ja właśnie przeczytałem, że operator == jest nieprzechodni :)

To znaczy: "foo" == 0 ^ "foo" == True ^ 0 != True.

To też jest zamierzone działanie? Bo jak dla mnie, to upośledzona logika, która początkujących może przyprawić o ból głowy i wymusić szukanie błędu.

Rozumiem potencjalną wygodę przy konwersji typów, ale jednak tutaj już lekko przegięli. Zgodnie ze wszelką logiką równość jest relacją przechodnią, ale PHP widać ma gdzieś powszechnie uznaną logikę i tworzy własną.

Domyślam się, że to zamierzone działanie, ale jednak nieco przesadzili.

Ja np. jako PHP newbie (a w zasadzie ktoś, kto w ogóle nie pisze w PHP) pogubiłbym się w tym kompletnie.

Ja w przy takich warunkach zawsze, ze względu tak na czytelność, jak i na takie niuanse, stosuja nawiasy :)

konto usunięte

Temat: WTF PHP ?

Andrzej Prażmo:
Paweł S.:
A ja właśnie przeczytałem, że operator == jest nieprzechodni
Operatorów w PHP, to generalnie lepiej unikać. Klasyka:

$x = 1.7;
$y = 1.9;
$a = $x + 0.1;
$b = $y - 0.1;
if($a == $b)
echo "a i b są takie same";
else
echo "a i b są różne";

Powodem takiego zachowania jest oczywiście brak typu decimal. Problem rozwiązano w tradycyjny dla tego języka sposób, czyli do istniejących 500 tys. funkcji dodano następne (bcadd, bcsub, itd.).

Znowu próbujesz błysnąć Andrzeju i znowu Ci nie wychodzi. Problem porównywania liczb zmiennoprzecinkowych istnieje w niemal każdym języki i wynika z ich natury. bcadd to jeden z wielu sposobów. Są też biblioteki (i nie tylko w PHP ale też w wielu językach) które liczby o bardzo dużej precyzji zapisują w postaci ciągów znaków i operują na tych ciągach znak po znaku.

Tego nie przeskoczysz. Jeżeli nawet jakiś język ma jakąś klasę Decimal która sobie jakoś tam radzi to i tak robi to poprzez zaokrąglanie wartości, operacje na ciągach znaków itp itd etc. Na ogół kończąc w ten sposób że 0.33333(3) (które wynikło wcześniej z dzielenia) +0.1 kończy jako 0.4 co właściwie nie jest prawdą... W zależności co robimy będzie to albo pożądane działanie lub nie.

Więc kwiatki o których mówisz to w rzeczywistości nic dziwnego. A sam PHP ma wielkie czerwone ostrzeżenie przy floatach.
http://php.net/manual/en/language.types.float.phpDariusz Półtorak edytował(a) ten post dnia 25.09.12 o godzinie 11:16

konto usunięte

Temat: WTF PHP ?

Paweł S.:
A ja właśnie przeczytałem, że operator == jest nieprzechodni :)

To znaczy: "foo" == 0 ^ "foo" == True ^ 0 != True.

To też jest zamierzone działanie? Bo jak dla mnie, to upośledzona logika, która początkujących może przyprawić o ból głowy i wymusić szukanie błędu.
Jak napisał Łukasz powyżej, stosuje się nawiasy. Zaleca to także oficjalna dokumentacja:

Use parentheses to ensure the desired precedence. For example, $a & $b == true evaluates the equivalency then the bitwise and; while ($a & $b) == true evaluates the bitwise and then the equivalency.

Ale kto by tam dokumentację czytał, co nie?
Andrzej Prażmo

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

Temat: WTF PHP ?

Dariusz Półtorak:
Problem porównywania liczb zmiennoprzecinkowych istnieje w niemal każdym języki i wynika z ich natury.

Ależ ja o tym doskonale wiem. Ja tylko piszę, że twórcy innych języków poradzili sobie z tym problemem wprowadzając typ decimal i dziwię się, że nie przyszło to do głowy twórcom PHP. Jaki to problem wprowadzić taki typ zmiennej i np. dodać funkcję pt.
"od_tej_pory_traktuj_wszystkie_liczby_z_przecinkiem_jako_decimal()"
Wywołanie takiej funkcji dawałoby się na początku skryptu i problem z głowy. Kompatybilność byłaby zachowana a nikt nie musiałby uskuteczniać spaghetti programmingu z funkcjami bcadd, bcsub.

konto usunięte

Temat: WTF PHP ?

Paweł S.:
A ja właśnie przeczytałem, że operator == jest nieprzechodni :)

To znaczy: "foo" == 0 ^ "foo" == True ^ 0 != True.

To też jest zamierzone działanie? Bo jak dla mnie, to upośledzona logika, która początkujących może przyprawić o ból głowy i wymusić szukanie błędu.

Chodzi Ci o coś takiego?

http://ideone.com/pcp1m

Ten test tego nie potwierdza - wszystkie wyrażenia obliczają się tak samo.
Bo chyba nie chodziło o brak nawiasów?

Temat: WTF PHP ?

Piotr L.:

Chodzi Ci o coś takiego?

http://ideone.com/pcp1m

Ten test tego nie potwierdza - wszystkie wyrażenia obliczają się tak samo.
Bo chyba nie chodziło o brak nawiasów?

Jak to nie potwierdza? Właśnie potwierdza.

Wszystkie trzy wymienione przeze warunki są spełnione, czyli relacja równości jest nieprzechodnia.

konto usunięte

Temat: WTF PHP ?

Paweł S.:
Piotr L.:

Chodzi Ci o coś takiego?

http://ideone.com/pcp1m

Ten test tego nie potwierdza - wszystkie wyrażenia obliczają się tak samo.
Bo chyba nie chodziło o brak nawiasów?

Jak to nie potwierdza? Właśnie potwierdza.

Wszystkie trzy wymienione przeze warunki są spełnione, czyli relacja równości jest nieprzechodnia.

A tak, teraz to widzę... Niezły kwiatek.
Andrzej Prażmo

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

Temat: WTF PHP ?

Piotr L.:
Paweł S.:
Wszystkie trzy wymienione przeze warunki są spełnione, czyli relacja równości jest nieprzechodnia.

A tak, teraz to widzę... Niezły kwiatek.
Bo, jak ktoś kiedyś trafnie napisał na którymś z blogów, PHP, to język, który służy do prezentacji prostych struktur danych na stronach WWW. Wszelkie próby wykorzystania tego języka do jakichś bardziej skomplikowanych aplikacji finansowych, z reguły kończą się tytułowym "WTF?".Andrzej Prażmo edytował(a) ten post dnia 25.09.12 o godzinie 12:24

konto usunięte

Temat: WTF PHP ?

Andrzej Prażmo:
Dariusz Półtorak:
Problem porównywania liczb zmiennoprzecinkowych istnieje w niemal każdym języki i wynika z ich natury.

Ależ ja o tym doskonale wiem. Ja tylko piszę, że twórcy innych języków poradzili sobie z tym problemem wprowadzając typ decimal i dziwię się, że nie przyszło to do głowy twórcom PHP. Jaki to problem wprowadzić taki typ zmiennej i np. dodać funkcję pt.
"od_tej_pory_traktuj_wszystkie_liczby_z_przecinkiem_jako_decimal()"
Wywołanie takiej funkcji dawałoby się na początku skryptu i problem z głowy. Kompatybilność byłaby zachowana a nikt nie musiałby uskuteczniać spaghetti programmingu z funkcjami bcadd, bcsub.

Eh, ile razy mamy Ci to tłumaczyć ? Nawet mój kot by to zrozumiał do teraz. PHP jest dynamicznie typowany. Masz FLOAT jak w każdym języku ZE WSZYSTKIMI JEGO WADAMI. To o czym mówisz to zwykła klasa, moduł języka który ma jakoś problem z precyzją liczb zmiennoprzecinkowych rozwiązać.

Teraz weź mi ku*** wytłumacz gdzie wg Ciebie masz to spaghetti programming między tym:

Decimal(1) / Decimal(7)


a tym:
bcdiv(1, 7, 50); // określiłem sobie precyzję btw


Wynik:

0.1428571428571428571428571429 (Python)
0.14285714285714285714285714285714285714285714285714 (PHP)


Tak na zdrowy chłopski rozum Python właśnie zrobił mi coś niemiłego bo zaokrąglił końcówkę tam gdzie mu się podobało podając znacznie mniej dokładny niż uzyskałem z użyciem bcdiv. Dobrze że to Twoje straszne bcdiv pozwoliło mi określić precyzję w dziecinny sposób dając mi dokładniejszy wynik.

Punkt widzenia zależy od punktu patrzenia. Teraz może ja zacznę narzekać czemu Twój wspaniały Decimal nie dał mi prostego i intuicyjnego sposobu na określenie precyzji działania...

//I jeszcze żeby domknąć ten temat:
bcdiv(1, 7, 1000);

0.1428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428


// EDIT 2
I jeszcze coś dla Ciebie Andrzeju. Apropo porównywania gołego floata w PHP z klasą Decimal w Pythonie (rozumiem że ten język miałeś na myśli). Twój przykład na który tak narzekasz zrealizowany w Pythonie. Kropka w kropkę to co napisałeś wyżej:


x = 1.7;
y = 1.9;
a = x + 0.1;
b = y - 0.1;
if a == b:
print 'a i b sa takie same';
else:
print 'a i b sa rozne';


Nie muszę chyba mówić że wynik to: "a i b sa rozne". Uwielbiasz widzę jeździć po PHP od czasu do czasu ale jakoś nigdy Ci nie wychodzi.Dariusz Półtorak edytował(a) ten post dnia 25.09.12 o godzinie 12:59

konto usunięte

Temat: WTF PHP ?

Andrzej Prażmo:
Paweł S.:
A ja właśnie przeczytałem, że operator == jest nieprzechodni
Operatorów w PHP, to generalnie lepiej unikać. Klasyka:
(ciach)
Powodem takiego zachowania jest oczywiście brak typu decimal. Problem rozwiązano w tradycyjny dla tego języka sposób, czyli do istniejących 500 tys. funkcji dodano następne (bcadd, bcsub, itd.).

W tym wypadku stosuje się typ Decimal - w każdym języku / środowisku, włączając w to COBOL, SQL, Delphi (Cardinal), PHP (BC Math), Python (decimal).

Float nigdy nie powinno się stosować do obliczania wartości finansowych.
A porównania float-ów w ogóle się nie stosuje bezpośrednio. Jest nawet o tym cały artykuł.

Więcej o tym:
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldb...
http://www.cygnus-software.com/papers/comparingfloats/...
http://stackoverflow.com/questions/17333/most-effectiv...
Łukasz Mordawski

Łukasz Mordawski Programista PHP

Temat: WTF PHP ?

Andrzej Prażmo:
Bo, jak ktoś kiedyś trafnie napisał na którymś z blogów, PHP, to język, który służy do prezentacji prostych struktur danych na stronach WWW. Wszelkie próby wykorzystania tego języka do jakichś bardziej skomplikowanych aplikacji finansowych, z reguły kończą się tytułowym "WTF?".
Złej baletnicy przeszkadza rąbek w spódnicy. Jak ktoś jest słaby to i w Javie i .net, i Delphi będzie miał tego typu WTF ;) Ja tam właśnie takiego działania bym się spodziewał po porównaniu o którym pisaliście. Chcesz zeby zadzialalo inaczej - uzyj nawiasow a przy okazji zwiekszysz czytelnosc tego kodu.
A jak koledzy mowia, liczby zmiennoprzecinkowe sa problemem w KAZDYM jezyku, a nie tylko w PHP.Łukasz M. edytował(a) ten post dnia 25.09.12 o godzinie 13:14

konto usunięte

Temat: WTF PHP ?

Łukasz M.:
Andrzej Prażmo:
Bo, jak ktoś kiedyś trafnie napisał na którymś z blogów, PHP, to język, który służy do prezentacji prostych struktur danych na stronach WWW. Wszelkie próby wykorzystania tego języka do jakichś bardziej skomplikowanych aplikacji finansowych, z reguły kończą się tytułowym "WTF?".
Złej baletnicy przeszkadza rąbek w spódnicy. Jak ktoś jest słaby to i w Javie i .net, i Delphi będzie miał tego typu WTF ;) Ja tam właśnie takiego działania bym się spodziewał po porównaniu o którym pisaliście. Chcesz zeby zadzialalo inaczej - uzyj nawiasow a przy okazji zwiekszysz czytelnosc tego kodu.
A jak koledzy mowia, liczby zmiennoprzecinkowe sa problemem w KAZDYM jezyku, a nie tylko w PHP.

Cóż, Andrzej ostatnio się zbulwersował bo znalazł w Pythonie funkcję format() klasy Decimal albo coś w ten deseń (nie pamiętam) i nie mógł znaleźć tego samego w PHP. Więc stwierdził że on tego języka nigdy nie użyje.
W tamtym wypadku utwierdzając się w swoim przekonaniu zaprezentował różnicę między... konwertowaniem ciągów znaków w PHP na float między ową metodą format która parsuje ciąg znaków i robi z niego floata jak mnie pamięć nie myli. Do teraz nie wiem co ma piernik do wiatraka.

Dzisiaj pokazał nam jak fajnie działają operacje na typie Decimal z gołymi floatami gdzie również nie widzę porównania. Oczywiście uznał że bcdiv się nie nada bo przecież to nie klasa Decimal i w ogóle. Gdzie jak widać Python z gołymi floatami również ma problem. Taki sam jak inne języki.

Widać ten typ tak ma. Nie wiem co on próbuje dowieść ale mu nie wychodzi.

Następna dyskusja:

Narzędzia do PHP




Wyślij zaproszenie do