» »

PHP razredi in konstruktorji

PHP razredi in konstruktorji

JesusChrist ::

Pozdravljeni!

Zanima me ena stvar glede konstruktorjev.

Izdelal sem torej sledeči konstruktor in 2 kao konstruktorja, med katerima se program odloči (glede števila podanih parametrov):
public function _construct() {
		$argv = func_get_args();
		switch(func_num_args())
		{
			default:
			case 1:
			self::_construct1($argv[0],$argv[1]);
			break;
			case 2:
			self::_construct2($argv[0],$argv[1],$argv[2]);
			break;
		}
	}
	
	public function _construct1($ime,$map)
	{
		$this->ime=$ime;
		$this->mapa=$map;
	}
	
	public function _construct2($id,$ime,$map)
	{
		$this->id=$id;
		$this->ime=$ime;
		$this->mapa=$map;
	}


Zadevo uporabim takole:
$objekt=new Teme("ime","mapa");
echo "text:".$objekt->getIme();


... Ampak zadeva ne deluje. Deluje le v primeru če ročno z get-erji in set-erji vnesem vrednosti spremenljivk. Torej zakaj mi konstruktor ne vpiše vrednosti v kreirani objekt? ;((
remember, the clock is ticking. run like no tomorrow.

technolog ::

zamenjaj:

self::_construct1($argv[0],$argv[1]);

z:

this->_construct1($argv[0],$argv[1]);

JesusChrist ::

na žalost je isto :/
remember, the clock is ticking. run like no tomorrow.

JesusChrist ::

ok sem ugotovil probleme :D

Problem je v tem, da je PHP verzija 5.3.2 (torej pod 5.3.3) in mora biti konstruktor ImeRazreda in ne _construct. Drugi problem pa je v tem, da mora število v case biti enako številu parametrov :)

Problem solved.
remember, the clock is ticking. run like no tomorrow.

keworkian ::

JesusChrist je izjavil:

ok sem ugotovil probleme :D

Problem je v tem, da je PHP verzija 5.3.2 (torej pod 5.3.3) in mora biti konstruktor ImeRazreda in ne _construct. Drugi problem pa je v tem, da mora število v case biti enako številu parametrov :)

Problem solved.


public function __construct ali pa imerazreda nima veze.

JesusChrist ::

Ima vezo. Pod verzijo 5.3.3. se uporabi ime razreda, pri 5.3.3. ali več pa _construct. Če nebi imelo veze bi mi delovalo v obeh primerih, pa ne deluje.

EDIT (iz PHP.net):
public function Bar() {
// treated as constructor in PHP 5.3.0-5.3.2
// treated as regular method as of PHP 5.3.3

Ok imaš prav - spregledal sem DVA podčrtaja in videl le enega :) (da ne bo zavajanja) Ampak od verzije 5.3.3 naprej pa ime razreda več ne deluje.

LP
remember, the clock is ticking. run like no tomorrow.

Zgodovina sprememb…

keworkian ::

JesusChrist je izjavil:

Ima vezo. Pod verzijo 5.3.3. se uporabi ime razreda, pri 5.3.3. ali več pa _construct. Če nebi imelo veze bi mi delovalo v obeh primerih, pa ne deluje.

EDIT (iz PHP.net):
public function Bar() {
// treated as constructor in PHP 5.3.0-5.3.2
// treated as regular method as of PHP 5.3.3


_construct() ne dela, dela pa če napišeš __construct().

HardFu ::

Ninjeti, da se ne bos narobe ucil PHPja (tko kot vecina, zal):
Konstruktorji v obliki __construct() (dva podcrtaja spredaj) so v uporabi v php5, v php4 pa si uporabil ime razreda, od 5.3.3 dalje pa ime razreda ni vec konstruktor. Ce imas torej PHP 5.2 naprimer, potem sta obe varianti valid konstruktorja.

Drugace pa bo verjetno manj problemov ce bos v parametrih konstuktorja definiral spremenljivke, da bos v nadaljnjem programiranju vedel kaj sprejme in v kaksnem zaporedju:
public function construct($id=null, $ime=null, $map =null)
{
        $this->id = $id;
        $this->ime = $ime;
        $this->mapa = $map;
}

Glede na to, da si v razredu najbrz ze definiral te spremenljivke in so itak null ne bo problemov, pa se manj kode mas.
Edino kar moras je potem vstavit null kot parameter ce imas prazno, npr:
$objekt = new Objekt(null, "ime", "mapa");
http://codeable.io

JesusChrist ::

No iz Jave mam navado pisanja večih konstruktorjev (včasih rabiš tudi več kot 1 ali 2 - odvisno od programa). Kako pa bo tole prebavila MySQL? Če dam v kontruktorju vrednost ID-ja null in zapišem v bazo bo deloval auto increment ali bo kaj problemov?

EDIT: drugače pa ja ... sedaj sem se začel konkretno učiti PHP (prej sem ga poznal in delal v njem bolj površno). Je pa res da je dosti lažje sedaj, ko obvladam recimo Javo in druge jezike.
remember, the clock is ticking. run like no tomorrow.

Zgodovina sprememb…



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

PHP in objektno programiranje (strani: 1 2 )

Oddelek: Programiranje
8512085 (10552) kivi113
»

php array in path določenega keya:

Oddelek: Izdelava spletišč
151349 (1177) HardFu
»

Qt Designer -> KDevelop C++ Error

Oddelek: Programiranje
352119 (1649) 'FireSTORM'
»

Kdaj uporabiti izjeme?

Oddelek: Programiranje
241693 (1574) Gundolf
»

[c++] stil kodiranja, informativno

Oddelek: Programiranje
171927 (1743) CCfly

Več podobnih tem