Kódkiegészítés
Sziasztok!
Olyan gondom van, hogy egy számomra nagyon tetsző framework-ot (CodeIgniter 2.1.0) és - szerintem - nagyon jó szerkesztőt (Komodo Edit 6) használok, de nincs kódkiegészítésem a CI "gyári" osztályaihoz és az általam írtakhoz sem. Ez nekem elég nagy probléma, úgy gyorsaságban, mint szintaktikai hibalehetőségként.
Próbáltam a Komodo-t "ráuszítani" a használt könyvtárakra (még egyenként is, bár elvileg az alkönyvtárakat is felveszi), de a plafon - jelenleg - az, hogy egy-egy helpernél működik. Ezek nem definiálnak osztályt, csak függvényeket.
Gondolom, a CI
Letöltöttem már a Komodo 7-et és a CI-ből is van már 2.1.1, de egyelőre nincs időm azokkal kísérletezni, de ha valaki azt mondaná, hogy akkor megoldódik a probléma, akkor a következő projektre már úgy készülnék.
Megköszönök minden észrevételt, elsősorban azok válaszát várom, akik használják/használták a fent említett szoftvereket.
Üdv. Pepita
■ Olyan gondom van, hogy egy számomra nagyon tetsző framework-ot (CodeIgniter 2.1.0) és - szerintem - nagyon jó szerkesztőt (Komodo Edit 6) használok, de nincs kódkiegészítésem a CI "gyári" osztályaihoz és az általam írtakhoz sem. Ez nekem elég nagy probléma, úgy gyorsaságban, mint szintaktikai hibalehetőségként.
Próbáltam a Komodo-t "ráuszítani" a használt könyvtárakra (még egyenként is, bár elvileg az alkönyvtárakat is felveszi), de a plafon - jelenleg - az, hogy egy-egy helpernél működik. Ezek nem definiálnak osztályt, csak függvényeket.
Gondolom, a CI
load->library(...)
osztály betöltése/kezelése körül van valami trükk, amit a Komodo "nem ért". Annyira még nem bengéztem át a kódják, hogy rájönnék. Illetve valószínűleg nem is tudok eleget hozzá, legalábbis tartok tőle. (Kicsit még mindig idegen az interpreteres OOP.) A saját doksijában erre nem térnek ki, csak kb. annyi van, hogy "ha betartod ezeket és ezeket a név/fájlnév/könyvtár szabályokat, akkor hú de jó neked, használhatod a loadert és csak egyszer fogja betölteni stb."Letöltöttem már a Komodo 7-et és a CI-ből is van már 2.1.1, de egyelőre nincs időm azokkal kísérletezni, de ha valaki azt mondaná, hogy akkor megoldódik a probléma, akkor a következő projektre már úgy készülnék.
Megköszönök minden észrevételt, elsősorban azok válaszát várom, akik használják/használták a fent említett szoftvereket.
Üdv. Pepita
Ezt találtam: Here is a link
autocomplete.php:
Na most ezeket te talán tudod értelmezni, én nem igazán, mert nem használom ezt a fajta editort. Igazából hülyét is kapnék, ha még a kódkiegészítést is külön be kéne konfigolnom... Netbeans-ben úgy megy, hogy amit beszórsz a projekt mappájába, azt automatikusan feldolgozza...
Thanks very much, inf3rno
Egyrészt felkeltetted az érdeklődésem a Netbeans irányába, másrészt ha bejön ez a trükk, nem sokat fogok vele vakerálni, mert amúgy is van egy "alapkészletem" (CI), amibe mindig berakosgatom a máshol is használható fejlesztéseimet, tehát valahogy ezt az alapot kell bevonjam a buliba. Remélem sikerül.
(Jó korán keltél. :))
Ha mégis netbeans-nél kötsz
Na utánanéztem nb sima változóinak is, és egészen furcsa...
Na szóval netbeans-en is van még mit fejleszteni... (Én 7.01-et használok, lehet, hogy azóta változott valamit ez is, majd írok a fórumjukba, ha mégsem.)
PHPStorm
Komodo
De nem működik
De nem megy a kódkiegészítés, az autocomplete.php-val sem. Könyvtárként (nyelvi) már többször hozzáadtam, az összes osztály a projekten belül van, mégsem. Azt is próbáltam, hogy van egy "induló projekt" vagy alap-könyvtáram, ahol az alap CI csomag van a saját újrahasznosítható osztályaimmal, és ezt a könyvtárat is megadtam PHP nyelvhez. Valamiért csak nem akarja, pedig már nagyon "összeszoktunk".
Gyanítom, hogy a CI osztálykezelésével lehet valami, mert korábban ha pl.
require_once
-al behúztam egy osztályt és simánnew
-val létrehoztam a példányt, akkor Komodo nem kérdezett semmit, simán a require-ből kitalálta, honnét kell kiegészíteni. (Persze akkor is projektkönyvtáron belül voltak.)Azért remélem lesz megoldás (Komodo-val) és nem egy olyan kérdést tettem fel, ami megoldatlan marad... :(
Apropó: nagy váltás Komodo-nál a 6-ról 7-re?
Apropó: nagy váltás
Én nem emlékszem semmilyen problémára, amit még a kiadás előtt jeleztem nekik, azt simán megoldották, így a megjelenéskor megvettem a 7-est is.
Megvetted?!
Lehet, valamit nagyon elnéztem, de eddig nem láttam fizetős Komodo-t. Most töltök egy kis időt "náluk"...
Szerk: már látom: az IDE. De a kódkiegészítéshez nincs köze.
Én elsősorban olyasmi "nagy váltásra" gondoltam, hogy pl. nagyon máshol és másképp néznek ki a snippet-ek vagy a projektfa, vagy nagyon másképp kell beállítani vmit, stb.
tippek
Az inf3rno által leírt módszert is meg kellene próbálnod. Lehet, hogy Komodoban kísérletezned kell vele, mert - ha jól értem - Netbeans a
/* @var $valtozo Tipus */
formát értelmezi, míg PHPStorm-ban a/** @var $valtozo Tipus */
forma a nyerő. Továbbá lehetséges, hogy nem mindegy, hogy a változó deklarálása előtt vagy után kell tenni ezt a tippet.PHPStormban ezzel a módszerrel *nem csak* egy függvény elején élhetsz, hanem akár egy
foreach
szerkezeten belül is.Az Eclipse is egy igen okos
Köszi, de
Én is
De ha nem is akarsz váltani, szerintem egy próbát megér.
Szerintem nincs valami
NetBeans + 1
Szerintem egy feltelepítést és kipróbálást másnak is megérhet! :)
Nem sűrűn van gond vele,
OK, kipróbálom
Már több ötletet is sikerült gugliznom (az első idézet alapján), de egyik sem oldotta meg a problémát. Még ki fogom próbálni a Komodo 7-el is, meglátjuk.
Eclipse PHP
Pythonhoz, Javahoz jó, de a PHP bővítménye szerintem katasztrofális.
Köszönöm mindenkinek,
Az az igazság, hogy a jquery-kódkieg. hiányán fenn sem akadtam, de a CI-hez nagyon kéne.
eclipse pdt
itt is úgy működik, hogy osztályváltozók felett /** @var DateTime */ esetleg /** @var DateTime[] */ ilyenkor egy foreach-en belül, már tudja, hogy DateTime
kódon belül /* @var $holnap DateTime */
függvényeknél és metódusoknál
/** @return DateTime */
azért ezeknek a dolgoknak megvan az a veszélye, hogy elbutulsz mellettük. én legalábbis ezt tapasztalom, bár lehet, hogy ez ettől független :D. memóriám már szinte nulla..
Tényleg tapasztalt már valaki olyat, hogy egy kód logikus felbontása bizonyos szinten túl már egyszerűen gátolja a munkában, osztály (legyen származtatott), kontroller, view, css, javascript.. ti ezt hogyan kezelitek?
Velem még nem :-) Ami most
Ami most nálam egy pici gát, hogy a paramétereket valahogy el kell juttatni az alsóbb osztályokba. Kéne időt fordítanom arra, hogy rendesen kidolgozzam a DIC objektum fát lazy inittel, mert most csak össze van szórva minden egy tömb fába.
Nem egészen értem :(
Mindenkinek a maga "bizonyos határait" kell szemelőtt tartania.
Igen, bizonyos szinten túl
Ez inkább kidolgozottság függő dolog. Ha valami bonyolódik, akkor mindenképp darabolni kell, mert ha mondjuk elér egy 200-250 soros hosszt egy osztály, akkor (legalábbis nálam) egyre jobban romlik a kód minősége. Úgy is fogalmazhatnék, hogy összeroskad a szerkezet a kód súlya alatt :D
A fájlok száma egyáltalán nem korlátozó tényező, ha deploy-nál összefűzöd az osztályokat nagyobb csomagokba...
Így közelít..
Mondjuk egy-egy model esetében (üres sorokkal együtt) értem el 500 körülit is, de ezeknél két fv. közt három (v. négy) üres sort hagyok.
Ha boldogulsz opcode cache
Nagy rendszerekben egyébként
Mostanában nálam elég ritka, hogy deklarációkat keresek, amikor az ide automatikusan átrak oda. Az autoloading tényleg fájós.
Azt hiszem,
require
történik, csak én megszoktam, hogy amíg van elegendő RAM-om, addig vrinyót minél kevesebbet (-szer)... A 200-300 már egész más szitu lenne, de azon még - sajnos - nem kell törjem a fejem.ha mondjuk létrehozol egy
$db=new DB();
akkor tudni fogja, hogy mi az a db és milyen metódusai vannak, de ha a DB osztályod query paramétere visszaad egy DataReader osztályt, akkor már a query függvény kommentezésénél meg kell adnod, hogy DataReader-t ad vissza és akár változóba teszed be az eredményt, vagy egyből metódusokat hívsz tudni fogja, hogy mik a lehetséges függvények.
szétkommentelés. én nem érzem felesleges kommentnek azt, hogy milyen paramétereket várok és mit adok vissza, ráadásul a paraméterekre eső részt akár automatikusan ki is tölti neked ha mondjuk adsz a változókra típusokat.
Ezek amúgy szabványos kommentek. és ha egy-egy framework nem használná ezeket, akkor igen nehéz volna a használatuk.
az aprózódásra amúgy úgy gondoltam, hogy 'legyen itt egy kis ajax dropdown', akkor a view file-ban adok neki egy osztályt, hogy a diszkrét js-emben jqueryvel meg tudjam találni, itt tolok egy ajax hívást, amit megkap a controller ahol betöltöm a megfelelő model-t akitől lekérem az adatokat, esetleg az adatokat átadom még egy view file-nak, amit aztán visszaköpök, hogy ismét a javascript-en legyen a sor, hogy beállíthassa a dropdown új elemeit.
no én ebben a folyamatban szoktam néha elveszni, valahogy így.
1. csináljunk akkor egy ilyet!
2. hol is kell kezdeni?
3. paparaparaparam.. áh itt!
4. mit akartam csinálni?
5. goto:1 :D
Na, itt lesz a hiba
Hát ez nem piskóta feladat...
Az (is) a gondom vele, hogy csak egyes részeit túrtam át, de elég komoly örökítési mélységek vannak benne, nem kívántam a rendszer teljes magját áttúrni... Hát, ha egyszer rá tudom venni magam (és időm lesz rá), akkor a végeredmény nagyon hasznos lenne.
A kommentekre azért van
ötlet(?)
Ez nem az én ötletem, Delphi-ben remekül műxik, tetszőleges öröklődési mélységig használható, plusz még szintaktikai ellenőrzés szintjén is figyel rá, hogy egy osztály forrását ne akard többször "include-olni".
Nyilván használok interface-t
pl egy sima változónál csak így megy a kódkiegészítés, ha olyan helyről szeded elő, amiről nem lehet biztosan tudni, hogy mit ad vissza:
Két csillaggal ugye phpdoc
Valszeg, nem tudom. Mondjuk
Ezt értem, nem erre gondoltam
Pont arra akartam kijukadni, hogy Delphiben meg kell hívjam az aktuális objektumom interface-ében
uses
után azoknak az osztályoknak a forrását, amikből ezen szülőobjektumon belül példányt akarok használni. Ez egyetlen uses lista az én unitom elején - és máris működik a kódkiegészítésem is, sintax-check, stb, fordításkor meg optimalizálja, hogy az egész projektbe "egy osztály csak egyszer legyen befordítva". (Természetesen ez a családfára is értendő.)Nagy különbség a kettő közt, hogy az ObjectPascal erősen típusos, a Delphi pedig igencsak fizetős... (Bár azt hallottam, van/volt már ingyenes verziója is.) De itt ugye a típusosság az, amin a PHP "elcsúszik", ha jól értem az eddigieket. Pedig valami ilyesmi varázslás - nekem - hietetlenül jól jönne...
$map
is kapott előzőleg egy/több értéket valahonnét, nem? Hát akkor az alapján kell tudni a típusát. (Bár ha pl.mysql_fetch_object
adta az erdményt, akkor akár stdClass is lehet, annak meg honnét ismerné a tulajdonságait.)Az egy és két csillag közt a különbség az interface, vagy a változó/függvény? (Mi a szabály?)
Na, ezeken még filóznom kell, elnézést az elmélkedésért és köszönöm mindenkinek az okítást, a napokban rengeteget tanultam itt!
A property és a metódus meg
A map-ről azért nem tudja, hogy mi van benne, mert az egy általános tároló, amibe mindent betehetsz. Mivel php gyengén típusos, ezért nincs bent olyan, mint pl java-ban a generics (nem tudom mi a magyar neve)... Pont ezért betehetsz akár vegyes típusú értékeket is egy gyűjteménybe. Ez rugalmas, viszont a gond akkor van, amikor ki akarod venni őket, mert ott nem lehet automatikusan megállapítani, hogy minek milyen a típusa, úgy meg pláne nem, hogy menjen is rá a kód kiegészítés... A foreach ciklusnál meg szintén bukó emiatt a kódkiegészítés. Az összes változó deklarációra meg kell adni kommentben a típust, a metódusok visszatérő értékéhez szintén meg kell adni. Egyedül a metódusok paramétere az, ami ímmel-ámmal típusos, de az sem működik egyszerű típusokra (kivétel tömb), csak objektumokra. Szóval a típusellenőrzés a php-ben nagyon el lett gányolva... (Gondolom itt is a visszafele kompatibilitásra hivatkoztak, mint ahogy egyébként szokták ilyen esetekben.)
Köszi!
Tehát a property és a metódus meg minden más bent van? Hol, a fájl elején (class előtt)?
A PHP szerintem azért ilyen-amilyen, mert egy egyszerű (nem OOP) szkriptnyelvnek indult azzal a céllal, hogy minél egyszerűbb legyen szerveroldalon csip-csup programocskákat futtatni. Aztán ezt fejlesztik tovább-tovább, ma már komoly OOP-t szeretnénk, de a nem megfelelő alapok miatt ez nyögvenyelős. Viszont fontos a visszafelé kompatibilitás is. A történelmét nem ismerem, csak tippelek. De sok olyan tulajdonsága van a nyelvnek, ami inkább jellemző egy struktúrált nyelvre, mint OOP-re.
Úgy értem, hogy a
Nekem csak az nem tetszik, hogy gányolnak, és a visszafele kompatibilitásra fogják az egészet. Pl a string függvények között meg sem próbáltak rendet tenni, pedig ha berakják őket több névtérbe, meg normálisan megcsinálják a paraméterezésüket és a karakterkódolás beállítását, akkor még talán használhatóak is lennének. Így kénytelen voltam saját utf-8 String libet csinálni, amiről legalább tudom, hogy melyik függvényt mit csinál configtól függetlenül...
Attól, hogy script nyelvnek indult még nem muszáj elgányolni a típusellenőrzést. A mai napig nem értem, hogyha az array-re (mint egyszerű típusra) tudtak type hint-et csinálni, akkor a string-re, integer-re, boolean-re miért nem. További érdekesség, hogy a 0-ból és a false-ból ''-re konvertálnak, ami szintén elég idegesítő tud lenni. De még sorolhatnám. Az egész nyelv egy átgondolatlan katyvasz. Ezt már sokan elmondták róla egyébként, csak valamiért a php hívők képtelenek elhinni. Ez kb ugyanolyan, mint a js-nél crossbrowser keretrendszert csinálni. Az erőfeszítések nagy része arra megy el, hogy egy jól használható közös felületet hozzál létre, csak azért mert az eredetit más elrontotta, és képtelen beismerni a tévedését, és kijavítani a hibát.
Típusos nyelv
Kliens oldalon persze már más a helyzet. Általában én optimista vagyok, de nemigazán tudom elképzelni, hogy az én életemben kompatibilisek (netán szabványosak) lesznek a böngészők. A gyártóknak nem érdekük, a W3C meg tutyimutyi és a gyártóktól kapja a pénzét...
A mai napig nem értem, hogyha
Mert gyakrabban gáncsolnád el magad az automatikus bool-int-string típuskonverziók miatt, mint ahányszor ténylegesen hasznodra lenne.
0-ból '0'-ra konvertál (nyilván). Booleannál meg teljesen logikus döntés, mert nem szeretnénk, ha bool->string->bool konverziónál változna az értéke.
Azok a nyelvek, amiket használnak, általában csúnyábbak, mint azok a nyelvek, amiket nem használnak, mert nem lehet ötletszerűen változtatni az interfészüket. A Javascriptnél ehhez még hozzájön az is, hogy semmi kontrollod nincs a futtatási környezet felett; PHP-ben (főleg ha saját magad által hostolt programot fejlesztesz) ennél azért lényegesen rózsásabb a helyzet.
false = ''
Szerintem inkább könnyítés akar ez lenni a fejlesztőktől nekünk, ha meggondolod, csomószor csinálsz olyan függvényt, ami ha minden ok, stringet ad vissza, ha hiba van, false-t (beépített is sok van).
MVC: view-ban kapsz egy tartalomrészt, így nem kell feltétel (pl. isset), egyszerűen kiírhatod, akkor is, ha false. Meg egy csomó más helyzetben is rövidíteni tudja a kódot (futásidőt); nem egy szép megoldás, de ki lehet használni.
Nekem csak annyi gondom volt
Hát éppen tárolhatod
Mert gyakrabban gáncsolnád el
Ezt elmagyaráznád? Én sehol nem használom az automatikus típuskonverziót (a number->string kivételével), mert szeretem tudni, hogy mi van 1-1 változóban...
Pl. megtalálod-e ebben a
A lekérésben access_level
Jó, hát egyébként erre az egészre mindenképp kell egy automatikus konverter, ami jelez ilyen hibáknál, mert különben sok lesz a duplikált kód, amiben könnyű hibázni...
Most mondhatnám, hogy olyan
(int)floor($x) == floor($x)
nem felétlenül teljesül), szóval a primitív típusokra vonatkozó type hint nem feltétlenül lenne kezdőbarát feature (és ehhez képest óriási haszna nincsen), márpedig a PHP fő erénye a kezdőbarátság.(Ez is érdekes olvasnivaló a témában.)
(Apró kérdés)
access_level
-ből hogyan lett a$row = $result->fetchAssoc()
után$row['accessLevel']
? Gyanítom, hogy ez nem hiba, csak nem látom, hogyan műxik.De, az hiba.
Egyébként van olyan, akinek
Ha rajtam múlna, akkor ezt az egészet elfelejteném, és olyan nyelvet csinálnék, aminél bár nem lenne muszáj, de lehetőség lenne típust ellenőrizni. Én ezt általában is megcsinálom, mert rengeteg hibát már az elején megfog, hogy pl neked boolean kell és nem null...
Ha meg akarod szeretni az
$_GET['a']+$_GET['b']
, anélkül, hogy egyáltalán értened kéne, hogy mik azok a típusok. Ha ezen felül még unicode string támogatás is van a nyelvben (amit hosszú távon nyilván a PHP sem fog megúszni), akkor meg egészen nagyon fájdalmas tud lenni, ha nem konvertál automatikusan a sima és unicode string között (vö. Python, pedig az csak néha nem teszi).Megoldás
A fő megoldás: az 1-nél közölt PHPDOC-ot nem autocomplete.php-ban kell megadni, hanem magában a Controller osztályt leíró ./system/core/Controller.php fájlban. Rövidítve így:
Így van kódkiegészítés (és marhára örülök :)) az alaposztályokban, ámde a saját kontrollerekben - modelekben még nincs. Valszeg ahhoz azoknak a változóit is meg kéne adni a Controller.php-ban.
Hibák:
- Elsősorban erre az autocomplete.php-ra hívom fel a figyelmet: ebben
class Controller {};
szerepel, de a 2.1.0 verzióban (gondolom 2.0-tól)class CI_Controller
van.- Lehet, hogy inf3rno "hülyét kap", de első próbák között szerepelt a Netbeans IDE 7.1.2 is, ugyanúgy nem volt kódkiegészítés, ezzel a fájllal sem, de akkor még nem javítottam benne a hibás osztálynevet...
- Belefutottam egy csúnyaságba. A próba-könyvtárból, ahol már ment a kódkieg., átmásoltam "külsőleg" a system megfelelő fájlait egy épp fejlesztés alatt lévő projekt system-ébe. És nem lett tőle kódkieg. Kiakadtam. Rá kellett u.is vegyem Komodo-t, hogy scannelje újra a könyvtárat (gondolom igencsak puffereli az eredményt). Erre semmilyen megoldást nem találtam a súgójában, ezért megnyitottam a projekten belül a Controller.php-t és a Model.php-t és itt "kézzel" újra módosítottam a comment részt. Ettől megjavult. De mire erre rájöttem... :(
- Mindenre van kódkiegészítés. Mármint minden gyermekosztályt lehet látni változóként kontrollerben (modelben), azokat is, amik nincsenek betöltve a loaderrel. És nem is jelez syntax errort, tehát vigyázni kell (nekem), hogy a
$this->load->library('Osztály');
előbb legyen. De ez már kicsike problem.Szóval nehéz volt, sok idegbaj, de végül sikerült. Köszönöm nektek.
Küldd át nekem az eredetit,
Egyébként próbáld ki a symfony2-t, most néztem át a kódját, és azóta mindenkinek ajánlgatom... :D
Elküldtem
Symfony2? Egyszer talán, ha lesz rá időm. Nekem a CI nagyon bejön. (Főleg így, kódkiegészítéssel.) A 3.0-át még nem néztem, lehet, ha az már nem annyira tetszetős, akkor váltani fogok.
Nézem. Nem biztos, hogy