- saxus blogja
- A hozzászóláshoz be kell jelentkezni
- 1765 megtekintés
Hozzászólások
Popcorn bekeszit. Majd kapod a flamet, hogy hat de a PHP igy meg ugy jo, meg ilyen jo OOP meg olyan jo OOP. Utana jonnek a Java fanok, hogy a Java ilyen jo, olyan jo. Aztan az ASP.NET-esek, hogy a .NET gyorsabb mint a Java, de ugyanolyan jo, aztan a Javasok, hogy a C# a Javarol masolt mindent, aztan jonnek a Ruby/Python fanok, hogy azok sokkal jobb kornyezetek, mert ezeknek jobb az API-ja, stbstb. Amugy a PHP tenyleg fos. Sokan nem fogjak fel, h ez se mas, mint egy template rendszer...azert az LOL, hogy barhol a kodban, barhol egy egyszeru echo hivassal tudok a bongeszo fele BARMIT irni. Nincs meg a REquest/Response szetvalasztas rendese (nem, meg a Zend Frameworkben sem, ott is irhatsz echot-t, mert nyelvi elem). Gagyi.
- A hozzászóláshoz be kell jelentkezni
El is kezdted ugyesen a flamelest.
- A hozzászóláshoz be kell jelentkezni
Már a cím alapján tudtam, hogy a PHP lesz terítéken.
Az említett "feature" valóban idegesítő, én sem szeretem, sajnos PHP4-es maradvány. Azt azonban el kellene fogadni, hogy ugyanúgy, mint más nyelvnek, a PHP-nek is megvannak a maga előnyei és hátrányai. A fenti példa az utóbbihoz tartozik.
- A hozzászóláshoz be kell jelentkezni
Hm. Lehet, a jelölés PHP-specifikus, ugyanis C++-ban ez elő szokott fordulni, ha a szülőosztálybeli azonos nevű függvényt meg kell hívni, és nyilván nem statikus függvényt. Olyankor például, amikor van egy absztrakt ősosztály, annak egy tisztán virtuális tagfüggvénye, amelyet a gyerek osztályok implementálnak. További öröklődéskor további adattagokat kell v. lehet használni, de a szülőosztály viselkedésére továbbra is szükség van, pusztán annak bővítését kell implementálni.
Vagy egy tisztán virtuális függvény "törzsét", kódját hívja meg a leszármazott osztály azonos nevű függvénye.
- A hozzászóláshoz be kell jelentkezni
Szerintem nézd meg jobban a kódot, semmiféle ősosztály nem játszik itt.
Adott két, egymástól független osztály, benne két függvény, amelyek nem statikusak (az, hogy virtuális-e vagy sem, az most itt lényegtelen).
Az egyik osztály meghívja a másik osztály metódusát, mintha statikus lenne (ld. :: operátor -> helyett), holott ez normális nyelvekben (C#, C++, stb.) le se fordulna.
Ráadásképp a hívott osztály a $this-t "megörökli" a hívó osztálytól, mintha a hívó osztály saját metódusa lenne, pedig semmiféle kapcsolatban nem áll a két osztály.
#include <iostream>
using namespace std;
//////////////////////////////////////////////////////////////////////////////
class A
{
public:
void Foo();
};
void A::Foo()
{
cout << "Hello";
}
//////////////////////////////////////////////////////////////////////////////
class B
{
public:
void Bar();
};
void B::Bar()
{
// error C2352: 'A::Foo' : illegal call of non-static member function
A::Foo();
}
//////////////////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
B b;
b.Bar();
return 0;
}
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
Azt láttam, hogy eltérő nevűek, de csak most tűnt föl, hogy függetlenek a típusok. Az agyam "kiegészítette" öröklődéssel, azt amit láttam. Merthogy ugye az elég gyakran együtt jár.
- A hozzászóláshoz be kell jelentkezni
Erdekes is lenne, ha nem hagyna, mikor a doksiban is benne van, hogy hagyja, es ebben az esetben mi tortenik:
http://hu.php.net/manual/en/language.oop5.basic.php
"The pseudo-variable $this is available when a method is called from within an object context. $this is a reference to the calling object (usually the object to which the method belongs, but possibly another object, if the method is called statically from the context of a secondary object)."
+peldakodot is talalsz alatta
Ha el akarod kerulni, az E_STRICT-et bekapcsolva warningot kapsz erre a hivasra (ezt is leirja).
--
"You will have to look a long way before you find a bunch of scum-suckers more greedy, humourless and deserving of death than the suits in the music business." - Terry Pratchett
- A hozzászóláshoz be kell jelentkezni
Csak szerintem gáz az, hogy van egy osztályod, bármelyik függvényét hívhatod statikusan, és egy másik osztály statikusan meghívott tagfüggvénye a $this segítségével _teljes mértékben_ hozzáfér a hívó objektumhoz? Hihetetlen ez a PHP-féle OOP.
- A hozzászóláshoz be kell jelentkezni
Ezt az egeszet ugy taglaljatok, mintha a kliens minden esetben hozza tudna ferni valamihez, anelkul, hogy a programozo ezt beleirta volna a kodba.
Tehat, az en elgondolasom szerint akkor fer hozza az altalad leirt modon, ha te igy irtad meg.
Mivel a PHP -t altalaban webes alkalmazasokban hasznaljuk, nagyon csunya lenne, ha csak a nyelv sajatossagaira hagyatkoznank, mindenfele ACL,stb. nelkul.
"-Pedig vegetariánus vagyok; csak növényevő állatokat fogyasztok!"
azenoldalamponthu
- A hozzászóláshoz be kell jelentkezni
A legnagyobb probléma valójában ez:
"Calling non-static methods statically generates an E_STRICT level warning."
Normális nyelvekben ez syntax error és le sem fordul a kód, nem pedig valamilyen szintű warning.
Hanyag programozók pedig mindenhol vannak, akik hibásan kódolnak (esetleg hozzászoknak, hogy így is lehet, de jó..nem, nem jó). és ha egy külső libet használok, akkor a nyelv miért hagyja, hogy egy másik objektum a hívó objektum mindenéhez hozzáférjen? Ez egy alapvető OOP tervezési elv semmibevétele, nyelvi tervezési hiba.
A PHP a modern kor BASIC-e. Bizonyos feladatokat nagyon kényelmesen lehet vele megvalósítani, de valójában egy rémálom.
- A hozzászóláshoz be kell jelentkezni
"A PHP a modern kor BASIC-e."
Több tiszteletet a BASIC-nek, ne hasonlítgassuk holmi PHP-hez. Köszi.
- A hozzászóláshoz be kell jelentkezni
Normális programozó IDE-t használ, ami meg mondjuk a :: után csak a statikus és megfelelő láthatósággal rendelkező metódusokat és változókat kínálja fel. Tudom, ez nem változtat a tényen, de szerintem kár ezen lovagolni. Szerintem nem rémálom, én szeretem a hibái ellenére is.
- A hozzászóláshoz be kell jelentkezni
Normális programozó IDE-t használ
ajaj, mindjárt beindul a vim vs IDE flame is :D
- A hozzászóláshoz be kell jelentkezni
A :: utan az IDE kiegeszitheti a nem statikus metodushovassal is, mert ez nem nyelvi hiba, a nyelv megengedi, hogy barmelyik fuggvenyt statikusan hivd meg. Legfeljebb warningot general. Ez a baj!
- A hozzászóláshoz be kell jelentkezni
A kedvedért elindítottam a Zend Studiot.
Objektum példány esetén a -> után felkínálja a statikus publikus metódust, a listában piros 'S' betűvel jelöli. A :: karakterek után _csak_ a statikus metódust jelenítette meg.
- A hozzászóláshoz be kell jelentkezni
Az egy dolog. De akkor se csinalna rosszul akarmelyik IDE, ha a nem statikusokat is kirakja a listaba. A nyelv megengedi.
- A hozzászóláshoz be kell jelentkezni
A nyelv megengedi, ha te is megengeded. Ha nem akarod, akkor error_reporting(E_ALL|E_STRICT);
.
A fenti példa eredménye:
Strict standards: Non-static method A::foo() should not be called statically, assuming $this from incompatible context in /home/protezis/devel/php/minimalscripts/classes/stricttest.php on line 12
Egy jó PHP programozó a fenti sorral kezdi a munkát.
- A hozzászóláshoz be kell jelentkezni
ahahaha. es szerinted a "nyelv megenegedi" -re megoldas a warning bekapcsolasa? istenem, php programozok...
- A hozzászóláshoz be kell jelentkezni
Nem, olyan szempontból nem megoldás, hogy a nyelv attól még valóban megengedi, de ha látom a warningot, akkor kijavítom. Az általánosításoktól pedig légyszíves tartózkodj.
- A hozzászóláshoz be kell jelentkezni
"attól még valóban megengedi"
egy ordas nagy fasságot, hozzátehetnénk?
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
Tessek mar megerteni,hogy itt baromira nem a warning leterol vagy nem leterol megy a vita. Parser error-ral kellene elszallnia, nem warninggal!!!!! Ez itt a lenyeg, es nem mas!
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
nincs kedvem tartozkodni
- A hozzászóláshoz be kell jelentkezni
Az E_STRICT nem warning :) Az az E_NOTICE-nál is kisebb prioritású, PHP 5.2-ben benne sincs az E_ALL-ban. Szóval a helyzet még rosszabb.
Nem feltétlen kellene syntax error-nak lennie, én bőven kibékülnék, ha a parse error-okat leszámítva mindenhol exception lenne (ahogy az jobb szkriptnyelvekben szokás).
- A hozzászóláshoz be kell jelentkezni
"PHP 5.2-ben benne sincs az E_ALL-ban."
Ezt jó tudni... Fostakony szar PHP...
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
Nemrég fedeztem fel, amikor megpróbáltam type hintelt OOP kódot írni:
"Catchable Fatal Error: Argument N passed to foo() must be an instance of Bar, null given"
Van egy előadás, amin elég sok PHP marhaság össze van foglalva: http://www.archive.org/details/SoyouthinkyouknowPHP
- A hozzászóláshoz be kell jelentkezni
Legyen csak parser/syntax error. Az exeption csak az emberek eletet bonyolitana.
Egyebkent is, nem tudom, egy ilyen nyiltan template alapu nyelvbe mi a feszkes frasznak OOP. Doglott lonak fenyes nyereg.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
"egy ilyen nyiltan template alapu nyelvbe mi a feszkes frasznak OOP"
Ugyanazért, amiért akármelyik másik OOP nyelvbe is.
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
Felreertesz. Nem maganak az OOP-nak a letenek ertelmet kerdojelezem meg, hanem annak, hogy valoban kell-e ez a PHP-ba. Alapvetoen a nyelv eredeti szintaxisa nem tette soha alkalmassa a nyelvet az objektum orientalt programozasnak meg a latszatara sem. Idokozben sikerult bevezetni az OOP-t, de - akarcsak a nyelv tobbi elemet - atgondolni ezt sem sikerult, gyanitom, hogy valami hasonlo szavazasos alapon ment a dolog, mint a namespace support.
A legnagyobb gond az, hogy a legtobb feature egy normalis QA folyamat utan torlesre kerulne a nyelvbol, egyszeruen azert, mert nagyon veszelyes az egesz a jelen allapotaban. Es itt nem csak az OOP specifikus problemakra gondolok, hanem az inkonzisztens core API-tol kezdve az eletveszelyesen liberalis parseren at nagyon sok mindenre.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
"valoban kell-e ez a PHP-ba."
Én azért örülök annak, hogy van, sok mindent gyorsabban, rugalmasabban meg tudunk oldani vele, mintha nem lenne.
"A legnagyobb gond az, hogy a legtobb feature egy normalis QA folyamat utan torlesre kerulne a nyelvbol, egyszeruen azert, mert nagyon veszelyes az egesz a jelen allapotaban."
Csupán ennyi a problémám.
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
Én nem igazán tudom, hogy min folyik a habverés, mivel a PHP születésénél fogva egy szkript nyelv, s a szkript nyelvek sajátossága, hogy olyan hajmeresztő dolgokat lehet bennük csinálni, amitől egy "normális" programnyelv még syntax error-t sem dobna, mert elájul a látványtól fordítás vagy értelmezés közben.
Az egy külön pikantériája az ügynek, hogy ezt az objektumorientált fasságot divat lett ráerőltetni mindenre (lassan a klozettot is csak úgy lehet lehúzni, hogy metódust hívok hozzá), s ilyenkor jön a zavar az éterben, mert az OOP-t is a szkriptnyelvekre jellemző lazasággal implementálja a PHP.
Ab start ilyen a filozófiája, miért lenne más az implementálása?
- A hozzászóláshoz be kell jelentkezni
Normális szkriptnyelvben nem lehet marhaságokat csinálni. Lehet hajmeresztő dolgokat művelni, mert sokkal rugalmasabb, mint egy fordított nyelv (lásd Ruby esetén a class metaprogramming praktikákat), de ez nálam inkább feature, mint bug.
- A hozzászóláshoz be kell jelentkezni