Pereiti prie turinio

PHP OOP: include klasėje


Rekomenduojami pranešimai

Sveiki,

 

esmė ta, kad require(include, include_once, require_once) neveikia viduje Class aprašo, galite pasibandyti, apie tai rašoma ir čia: http://bugs.php.net/bug.php?id=10430&edit=1

 

Dabar šią problemą sprendžiu aprašydamas metodą ir importuodamas tik jo kodą:

Class Klase {

 function metodas() {

include("metodas.php");

 }

}

 

Taigi ar yra koks tobulesnis šios problemos sprendimas, nes dabar gan bjauriai viskas gaunasi.

 

Beje, nelabai supratau šio sakinio prasmę

You have to include the method definitions inside the class {}

 

Kas nors paaiškins?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Man tai įdomu, kokį tu čia anti-pattern'ą naudoji, kad tokias pornografijas darai. Neįsivaizduoju, kada gali reikėti įterpinėti failą klasėje, o ne prieš jos deklaravimą.

Redagavo CR1M1N4L
Nuoroda į pranešimą
Dalintis kituose puslapiuose
Noriu įterpinėti metodus į klasę, kas čia negerai? Ar gal gali pasiūlyti kažką geresnio, šiaip ar taip to ir prašiau.

Nu tu pasakyk, kam tau reikia įterpinėti kažką? Ko negali normaliai, kaip visi normalūs žmonės, ir rašyti metodo turinio ten, kur ir yra tas metodas?

Nuoroda į pranešimą
Dalintis kituose puslapiuose
Dėl elementarios tvarkos, kad klasės failas nebūtų 2000 eilučių ilgio, dar kartą klausiu, kas negerai?

 

Anokia čia tvarka pas tave. Kad peržiūrėt visą (vieną) tavo klasę, reik 10 tab'ų IDE'j atsidaryt? Niekas taip nedaro ir nedarė. Ta prasme, man išvis nesuvokiama tokia idėja. Pasiskaityk apie paveldėjimus, interfeisus, abstrakčius metodus ir šiaip OOP principus...

Nuoroda į pranešimą
Dalintis kituose puslapiuose
Pasiskaityk apie paveldėjimus, interfeisus, abstrakčius metodus ir šiaip OOP principus...

Būtinai perskaitysiu, tada paskutinis klausimas, tam, kad mano klasė nebūtų pornografinė ir netektų mesti programavimo, ji turėtų būti visa viename faile, kad ir x tūkstančių eilučių?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ne pornografija, bet nelabai geras pavyzdys kaip reikėtų elgtis su php klasėmis. Kadangi php yra interpretuojama kalba, galima labai stipriai susimauti su rekursija. Paprasčiausias problemos sprendimas butų naudoti extends and implement :)

 

a.php

<?

require_once 'b.php';
$a = new b();
echo $a->ca();

?>

 

b.php

<?

require_once 'c.php';
class b extends c
{

}

?>

 

c.php

<?php

class c
{
public function ca()
{
return "CA";
}
}

?>

Nuoroda į pranešimą
Dalintis kituose puslapiuose
Būtinai perskaitysiu, tada paskutinis klausimas, tam, kad mano klasė nebūtų pornografinė ir netektų mesti programavimo, ji turėtų būti visa viename faile, kad ir x tūkstančių eilučių?

 

Iš dalies, taip. Bet čia kitas aspektas: klasė turi būti skirta konkrečiam, vieną paskirtį turintiems veiksmams. Jei klasė dirba su vartotojų autentikacija, tai būtent tai ji ir daro, o ne tuo pačiu sesijų, DB, loginimo ir dar kokius variklius implement'ina. Laikantis šio principo, klasės netampa milžiniškos, tampa lengviau suprantamos, tampa lengviau perkeliamos ir modifikuojamos.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

1. Kokia priešistorinę PHP versiją naudoji? Bugas yra 4.0.4pl1 versijos 2001 metų ir iš vis 4.x versija jau galima sakyti nepalaikoma (tuoj nutrauks palaikymą).

2. require, include veikia metoduose tikrai.

3. Kas kalba, kad tai nesamonė, galėtų patylėti ir daugiau pasiskaityti apie OOP 100% karkasų ką nors įterpia klasėse (šablonai, exceptions ir pan.). Tačiau jei įterpiamas kodas, tai tiesiog nepraktiška.

4. Sėkmės besimokinant.

Nuoroda į pranešimą
Dalintis kituose puslapiuose
3. Kas kalba, kad tai nesamonė, galėtų patylėti ir daugiau pasiskaityti apie OOP 100% karkasų ką nors įterpia klasėse (šablonai, exceptions ir pan.). Tačiau jei įterpiamas kodas, tai tiesiog nepraktiška.

 

Nu nu, papasakok plačiau, su konkrečiais pavyzdžiais. Su OOP dirbu ne vieni metai, bet dar nė karto nemačiau, ir juolab nerašiau tokio ar panašaus kodo:

public function someMethod() {
include 'someMethod.php';
}
public function someOtherMethod() {
include 'someOtherMethod.php';
}

 

Vienintelis atvejis galbūt kada tai naudojama, dinaminiam klasių užkrovimui (aka loader'iui)

Redagavo CR1M1N4L
Nuoroda į pranešimą
Dalintis kituose puslapiuose
Nu nu, papasakok plačiau, su konkrečiais pavyzdžiais. Su OOP dirbu ne vieni metai, bet dar nė karto nemačiau, ir juolab nerašiau tokio ar panašaus kodo:

public function someMethod() {
include 'someMethod.php';
}
public function someOtherMethod() {
include 'someOtherMethod.php';
}

 

Vienintelis atvejis galbūt kada tai naudojama, dinaminiam klasių užkrovimui (aka loader'iui)

 

Skaityk kas aukščiau parašyta :) rašiau, kad taip nepraktiška ir nenaudotina čia sutavim sutinku. o įterpimai yra įprastas dalykas (Zend Framework Zend/Acl.php):

if ($this->has($resourceId)) {
		require_once 'Zend/Acl/Exception.php';
		throw new Zend_Acl_Exception("Resource id '$resourceId' already exists in the ACL");
	}

Zend/View.php

if ($this->_useViewStream && $this->useStreamWrapper()) {
		include 'zend.view://' . func_get_arg(0);
	} else {
		include func_get_arg(0);
	}

Ir tokių pavyzdžių galima sakyti kiekvienoje Zend Framework klasėje.

Redagavo Irmantas
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Aš palaikau tą pusę, kuri sako, kad "elementarios tvarkos" tokiu būdu neįvesi :)

...bet jei jau daryti kažką tokio, tai manoji (ne)rekomendacija, greičiau interpretacija, būtų tokia:

 

<?php
class KažkokiaKlasė {
private $init_metodai = array();

/**
 * Super magic metodas, padarantis šią klasę super magic klase...
 */
public function __call($name, $args) {
	$funkcija = 'KažkokiaKlasė_'.$name;
	if(!isset($this->init_metodai[$funkcija])) {
		$failas = 'KažkokiaKlasė.'.$name.'.php';
		if(is_file($failas))
			require_once $failas;
		else
			throw new Exception('Klasės '.get_class($this).' metodas '.$name.' nerastas.');
		$this->init_metodai[$funkcija] = true;
	}
	return call_user_func_array($funkcija, $args);
}
}

// Failas: KažkokiaKlasė.kažkoksMetodas.php
function KažkokiaKlasė_kažkoksMetodas() {
// Darome kažką...
print_r(func_get_args());
}

// O tai veikia...
$o = new KažkokiaKlasė();
$o->kažkoksMetodas('a', 'b', array('c'));

// (Kodas netestuotas, tiesiog "minčių kratinys on the fly", gali neveikti).

 

Žinoma, tokia struktūra padarys tik galvos skausmą, o ne "tvarką". Jeigu failai gaunasi labai dideli (kalbu ne apie šimtus ir ne kelis tūkstančius eilučių), vertėtų savęs paklausti: ar aš teisingai suprantu, kokį objektą, kokio objekto funkcionalumą aš čia kišu? Gal iš tiesų aš čia apjungiau 5 objektus, kuriuos iš tiesų reikėtų iškelti į atskiras klases?

 

Vietoj to, kad daryti kažką savo, geriau yra paskirti atitinkamai laiko naudingos literatūros ar protingo (sąlyginai :)) kodo peržiūrai, framework'ų analizei. O pats geriausias mokytojas: praktika šalia kitų gudrių programerių. Kurie, kai darai nesąmonę, tai pasako... :D

 

PS> mieli programeriai, kodėl jūs tokie pikti? Negi smagiau drabstytis nei pasidalinti patirtimi ar kodo gabalu? Kiekviename dalyke galima įžvelgti kažko jei ne naudingo, tai bent įdomaus :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

if ($this->has($resourceId)) {
		require_once 'Zend/Acl/Exception.php';
		throw new Zend_Acl_Exception("Resource id '$resourceId' already exists in the ACL");
	}

Čia be konteksto negaliu tiksliai spręsti, bet šiaip aš taip nedaryčiau. Logiška manyti, kad klasė neapsiriboja 1 exception'u. Exception'ą gali reikėti keliuose vietose "išmesti", todėl būtų daug patogiau prieš šią klasę įterpti Zend/Acl/Exception.php. O šiaip asmeniškai mėgstu autoloader'į naudoti. Performacas krenta šiek tiek, bet nemirštu. Kitose vietose, savęs neribojant, galima aplikaciją optimizuoti.

Nuoroda į pranešimą
Dalintis kituose puslapiuose
if ($this->has($resourceId)) {
		require_once 'Zend/Acl/Exception.php';
		throw new Zend_Acl_Exception("Resource id '$resourceId' already exists in the ACL");
	}

Čia be konteksto negaliu tiksliai spręsti, bet šiaip aš taip nedaryčiau. Logiška manyti, kad klasė neapsiriboja 1 exception'u. Exception'ą gali reikėti keliuose vietose "išmesti", todėl būtų daug patogiau prieš šią klasę įterpti Zend/Acl/Exception.php. O šiaip asmeniškai mėgstu autoloader'į naudoti. Performacas krenta šiek tiek, bet nemirštu. Kitose vietose, savęs neribojant, galima aplikaciją optimizuoti.

 

Taip įterpti galima būtų ir viršui, autoloaderis nuostabus dalykas. Tačiau šiuo atvėju tai yra geresnis variantas, jei kodas tvarkingas ir klaidos pasitaikymas yra minimalus tai nereikia krauti papildomos klasės, sutaupomi resursai padidėja performance o tai reiškia, kad kodas yra optimalesnis, profisionalesnis.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Vėl aš savo trigrašį įkišiu, jeigu dabar pasirinksiu tokį variantą, nepyksit ant manęs? :)

 

pageClass.php

include("pageinitClass.php");

Class pageClass extend pageinitClass {


}

 

pageinitClass.php

include("usersClass.php");

Class pageinitClass extend usersClass {


}

 

usersClass.php

Class usersClass {


}

 

Be to, ar įmanoma kaip nors daryti extend daugiau nei vieną klasę, pvz.: Class Klase extends Klase2, Klase3 ? Ar be to "traukinio" neapsieisiu?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

PHP tiesiogiai paveldėti gali tik 1 klasę. Bet yra ne vienas būdas, kaip galima tai "apeiti"... Žiūrint, ko tau reikia.

 

Nėra rekomenduojama daryti gilesnio nei 2 lygių paveldėjimo, nes vėlgi bus susiduriama su "kodo blogybėmis". Bei neaišku, kaip greit tai veiks :)

 

PS> extends, o ne extend.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Už tai, kad mano programa atitinka MVC standartus, rankos nukirsti neduočiau, bet templates iškelti į atskirus failus ir stovi funkcijose. PHP failuose, kuriuos lankys vartotojas, yra tik kreipiniai į failo funkciją atitinkančius metodus, jokių if ir jokių kitų pašalinių veiksmų. O metoduose yra daromi nustatyti veiksmai, kreipiantis į funkciją, į kintamąjį įkeliami templates ir tik viename metode pavadinimu display(), yra panaudotas žodis print, išprintinant tą kintamąjį su visu kontentu, kitaip nesugalvojau.

 

Dabar metas moralui, visi šiti komentatoriai, kaip supratau, niekada nebuvo susidūrę su problema, kurios nebūtų galėję išspręsti patys ir tektų kreiptis į forumą pagalbos, greičiausiai gimė mokėdami PHP, JS, CSS, teliko išmokti HTML. Kita teorija galėtų būti, kad jiems paprašius pagalbos, buvo įvairiai išvadinti, todėl gavo traumą, kurią visiems rodo, tačiau čia tik teorijos, paremtos dviejų žmonių, dviem žinutėm. Dar kartą dėkui, kas padėjo...

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...