DarkSide Posted August 22, 2006 Report Posted August 22, 2006 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...
konrads Posted August 22, 2006 Report Posted August 22, 2006 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: .
bubu Posted August 22, 2006 Report Posted August 22, 2006 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
DarkSide Posted August 23, 2006 Author Report Posted August 23, 2006 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.Slikti manuāli esi lasījis. Īpaši šo: http://lv2.php.net/manual/en/faq.migration....migration5.oopUn turpat arī ir atbilde: http://lv2.php.net/manual/en/ini.core.php#...patibility-mode 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?
john.brown Posted August 23, 2006 Report Posted August 23, 2006 PHP4 un PHP5 cik lasīju īsti nemāk sadzīvot abi uz viena webservera... (vismaz Apache vajag 2 instances tad turēt). Nevajag gan. Vienu php vajag laist kā cgi, otru - kā apache moduli. Un trabliem nevajadzētu būt...
DarkSide Posted August 24, 2006 Author Report Posted August 24, 2006 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?
AcidRain Posted August 24, 2006 Report Posted August 24, 2006 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.
bubu Posted August 24, 2006 Report Posted August 24, 2006 Tīrā CGI protams, ka bremze. Taču, cik esmu dzirdējis un lasījis - ar FastCGI tas esot pat ātrāk nekā ar mod_php.
Recommended Posts