Jump to content
php.lv forumi

clone() PHP4,PHP5,OOP


DarkSide

Recommended Posts

Sveiki!

Skat. sekojošu koda gabaliņu. Principā visa problēma aprakstīta jau pašā kodā:

<?php
// Class definitions
class c_parent {
function c_parent() {/*not used*/}
function do_parent() {
	$classname = get_class($this);
	echo 'Classname: '.$classname.'<br/>';	// output c_child (ok)
	$d = new $classname;
	$d = $this; // Ja rakstam $d=clone($this), tad viss ir ok, bet clone() darbojas tikai PHP5 :(
	$d->attr=1;
	return $d;
}
}
class c_child extends c_parent {
var $attr;
function c_child() {$this->attr=0;}
function do_child() {
	echo 'before:'.$this->attr.'<br/>';		// output 0 (ok)
	echo 'Calling do_parent():<br/>';
	$d = $this->do_parent();
	echo 'after:'.$this->attr.','.$d->attr.'<br/>'; // output 1,1 (why not 0,1 ?)
}
}

// Main Program
$entity = new c_child();
echo 'Class attribute='.$entity->attr.'<br/>';	// output 0 (ok)
echo 'Calling do_child():<br/>';
$entity->do_child();
echo 'Class attribute='.$entity->attr.'<br/>';	// output 1 (why?)
?>

Problēma ir tur, ka clone() darbojas tikai PHP5, bet sākotnēji šāda veida klases izveidoju un ražošanā tās darbojas uz PHP4 vides. Pārejot uz PHP5 rodas problēmas a kodu mainīt nepavisam negribas. Vai ir kādi skaidrojumi, ieteikumi utt., kādēļ tā notiekas. Kāpēc PHP5 netaisa automātisku clone()?

Vienvārdsakot interesē Jūsu pārdomas par tēmu...

Link to comment
Share on other sites

Problēma ir tur, ka clone() darbojas tikai PHP5, bet sākotnēji šāda veida klases izveidoju un ražošanā tās darbojas uz PHP4 vides. Pārejot uz PHP5 rodas problēmas a kodu mainīt nepavisam negribas. Vai ir kādi skaidrojumi, ieteikumi utt., kādēļ tā notiekas. Kāpēc PHP5 netaisa automātisku clone()?

Vienvārdsakot interesē Jūsu pārdomas par tēmu...

 

 

PHP4 jāpamet kā sērgu. Iekš PHP5 ir Reflection API (iesaku versiju 5.1.3+). Ar to tad arī taisīt Factory veidīgos:

 

.

Link to comment
Share on other sites

Tāpēc, ka php5 visus objektus piešķir/padod funkcijām pēc references. Taču php4 taisa vienmēr kopijas - pat vienkāršai $x = $y piešķiršanai. Kāpēc? Performances dēļ droši vien.

 

Un kāda jēga no šīm divām rindiņām?

$d = new $classname;
	$d = $this; // Ja rakstam $d=clone($this), tad viss ir ok, bet clone() darbojas tikai PHP5

Pirmajā tu uztaisi jaunu objektu. Otrajā tu iepriekšējam objektam pa virsu uzraksti $this. Kāpēc tad bija jātaisa jauns objekts?

 

Slikti manuāli esi lasījis. Īpaši šo: http://lv2.php.net/manual/en/faq.migration....migration5.oop

Un turpat arī ir atbilde: http://lv2.php.net/manual/en/ini.core.php#...patibility-mode

Link to comment
Share on other sites

PHP4 jāpamet kā sērgu. Iekš PHP5 ir Reflection API (iesaku versiju 5.1.3+). Ar to tad arī taisīt Factory veidīgos:
Zinu jau ka būtu forši pāriet uz PHP5, bet ko lai dara, ka lielākā daļa projektu, kas man ir tikuši pasūtīti tika pasūtīti taisīt tieši PHP4... :(

 

Tāpēc, ka php5 visus objektus piešķir/padod funkcijām pēc references. Taču php4 taisa vienmēr kopijas - pat vienkāršai $x = $y piešķiršanai. Kāpēc? Performances dēļ droši vien.

Tas ir skaidrs - izlasīju precīzāk tagad. Sorry :)

Un kāda jēga no šīm divām rindiņām?

$d = new $classname;
	$d = $this; // Ja rakstam $d=clone($this), tad viss ir ok, bet clone() darbojas tikai PHP5

Pirmajā tu uztaisi jaunu objektu. Otrajā tu iepriekšējam objektam pa virsu uzraksti $this. Kāpēc tad bija jātaisa jauns objekts?

Ups - patiešam - thanx ka norādīji uz nepilnību.
Viss jau būtu forši, bet problēma ir tāda, ka ne vienu vien projektu esmu taisījis uz PHP4, kur samērā biezā slānī izmantoju līdzīgas konstrukcijas kā augstākesošajā koda gabaliņā. Doma bija neko daudz nepārkodējot pārcelt šos projektus uz PHP5. Cik saprotu tad vienīgais risinājums ir ze1-compatibility-mode norādīšana, bet tad atkal sūdīgi tas, ka tas attieksies uz visiem (arī nākotnē jau uz PHP5 veidotiem) projektiem :(

Rezultātā sanāk tā, ka principā man sanāk uzturēt vecos projektus uz PHP4 anyway un jaunos jau taisīt uz PHP5, bet atkal probza - PHP4 un PHP5 cik lasīju īsti nemāk sadzīvot abi uz viena webservera... (vismaz Apache vajag 2 instances tad turēt)... Stulbi :(

Kāda ir Jūsu pieredze ar PHP4 veidotu projektu pārcelšanu uz PHP5? Varbūt kādi ieteikumi?

Link to comment
Share on other sites

Nevajag gan. Vienu php vajag laist kā cgi, otru - kā apache moduli. Un trabliem nevajadzētu būt...
A PHP kā CGI strādā labi? Cik esmu lasījis, tad itkā tas CGI variants esot toļi gļukains toļi liela bremze... Vai tad tā nav?
Link to comment
Share on other sites

PHP CGI modē lietoju jau kādu labu laiku.

Nenovēroju nekādas bremzēšanas un man ļoti patīk ko tas sniedz kopā ar SUEXEC.

Attiecīgi es varu katram projektam likt savu php versiju bez nekādām problēmām.

Un plus vēl man katrs projekts griežas zem sava lietotāja un permisijas tiek saliktas tādas, ka nav iespējams no viena projekta tikt pie kāda cita failiem.

Protams, vislabākais risinājums, manuprāt ir jail'i, bet man ir pārāk liels slinkums, lai taisītu n-tos jail'us un vēl visādas izvirtības.

Link to comment
Share on other sites

×
×
  • Create New...