[php] Probleem met PHP5->PHP4

Pagina: 1
Acties:
  • 1.069 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 01:32

alienfruit

the alien you never expected

Topicstarter
Ik ben bezig geweest met een conversie van PHP5 code na PHP4 code. De oorspronkelijk PHP5 code bestaat uit een abstract class die heb laten vervallen. Verder werd er gebruik gemaakt van private/public functies, de keywords heb ik weggehaald.

Nu heb ik alleen het probleem dat de code prima werkt onder PHP5 maar niet onder PHP4, nu denk ik dat het te maken heeft met de veranderen qua references in PHP5. Nu heb ik dus op verschillende plaatsen & voor functies en variables geplaatst, alleen het maakt tot heden nog geen verschil. Ik snap er helemaal niks meer van :(

Iemand enig idee wat het probleme zou kunnen zijn? Ik vind het zelf namelijk vervelend om voor zoiets over te schakelen naar PHP5.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<?php

require_once( 'class.url.inc.php');
require_once( 'Database/class.database.inc.php');
require_once( 'Database/class.queryresult.inc.php');
require_once( 'Database/class.databasefactory.inc.php');

////////////////////

$list = Gateway::load( Finder::findByParentId( 1 ) );
$adapter =& new TreeAdapter( &$list[0] );
$walker =& new TreeIterator( &$list );
$walker->walk( &$adapter );
$items =& $adapter->getItems();
print_r($items);

///////////////////

class Gateway {
    function Gateway() {}
    
    function &load( $resultset=FALSE ) {
        $items = array();
        if ( $resultset ) {
                while(false !== $resultset && false !== ($row = mysql_fetch_array( $resultset, MYSQL_ASSOC ) ) ) {
                    $items[] = $row;
                }           
        }
          
        return $items;
    }
}

class Finder {
    function Finder() { }
    
    function &findByParentId( $id ) {
        $link = mysql_connect( "localhost", "root", "xs4root") or die( "Kan niet verbinden: " . mysql_error());
        mysql_select_db( 'blossom' );
        $resultset = mysql_query( "SELECT * FROM catologue WHERE parent = {$id}" );
        if ( !$resultset ) {
            trigger_error( 'Error occured while obtain resultset. (' . mysql_error()  . ')', E_USER_WARNING );
            return FALSE;
        }
                                                        
        // when fails it returns FALSE otherwise the QueryResult()
        return $resultset;
    }
}

class TreeIterator {
    var $items;
    
    function &TreeIterator( $items ) { 
          $this->items = $items; 
    }
    
    function &walk( &$adapter ) {
        $items =& $this->items;
        foreach( $items as $item ) {
            $adapter->push( &$item );
            $walker =& new TreeIterator( Gateway::load( Finder::findByParentId( $item[ 'id'] ) ) );
            $walker->walk( &$adapter );
        }
    }
}

class TreeAdapter {
    var $items;
    
    function &TreeAdapter( &$item ) { 
        $this->items =& new Node( &$item );
    }
    
    function &getItems() {
        return $this->items;
    }
    
    function &push( $item ) {
        $c = new Node( &$item );
        if ( $tmp =& $this->traverse( $this->getItems(), $item ) ) {
            $tmp->attach( &$c );
        }
    }
    
    function &traverse( &$Node, $item ) {
        if ( $Node->getId() == $item[ 'parent' ] ) {
            return $Node;
        } else {
            if ( $Node->hasChildren() ) {
                $children =& $Node->getChildren();
                foreach( $children as $child ) {
                    $c =& new Node( &$item );
                    if ( $tmp =& $this->traverse( &$child, &$item ) ) {
                        $tmp->attach( &$c );
                    }
                }
            }
        }
    }
}

class Component {
    var $id;
    var $name;
    var $parent;
    var $children = array();
    
    function &Component( &$item ) { 
        $this->id = $item[ 'id' ];
        $this->name = $item[ 'name' ];
        $this->parent = $item[ 'parent' ];
    }
    
    function getId() {
        return $this->id;
    }
    
    function getName() {
        return $this->name;
    }

    function getParent() {
        return $this->parent;
    }
    
    function hasChildren() {
        return count( $this->children );
    }
    
    function getChildren() {
        return $this->children;
    }
    
    function &attach( &$Node ) {
        $this->children[] =& $Node;
    }
}

class Node extends Component {
    function &Node( &$item ) {
        parent::Component( &$item );
     }
}

[ Voor 20% gewijzigd door alienfruit op 15-07-2005 12:29 ]


Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 19-09 09:34

thomaske

» » » » » »

Wat werkt er niet aan?

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 01:32

alienfruit

the alien you never expected

Topicstarter
De recursie werkt in PHP4 niet, oftewel ik krijg niet de hele boomstructuur. Terwijl het gewoon prima werkt in PHP5 (dezelfde code). De code kan erg makkelijk uitgeprobeerd worden door een simpele tabel met drie velden id, parent en name.

[ Voor 29% gewijzigd door alienfruit op 15-07-2005 12:00 ]


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 12:54
Om hetzelfde effect in PHP4 te realiseren moeten er nu overal en nergens references (&) worden toegepast.

Je zou aan de hand van deze pagina kunnen localiseren waar je references moet plaatsen. En dan stap voor stap je code moeten omzetten en debuggen.

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 01:32

alienfruit

the alien you never expected

Topicstarter
Ja, ik heb inmiddels dat al geprobeerd, alleen het maakt geen verschil :( Ik heb de code hierboven aangepast.

[ Voor 5% gewijzigd door alienfruit op 15-07-2005 12:29 ]


Acties:
  • 0 Henk 'm!

Verwijderd

References in PHP4 is een beetje een raar verhaal. 'Echte' references zoals in java of php5 heb je niet. Waar en waarom je een & moet plaatsen wordt duidelijk uitgelegd op:

http://www.obdev.at/developers/articles/00002.html
Whenever a variable cointaining an object reference is passed (assigned to another variable, put into an array, passed as an argument to a function or returned by a function), pass it "by reference". You should use:

* "=&" for assignments
* "function &somefunction(...) {...}" when defining functions that return objects
* "&$anObjectRef" for object arguments (parameters) in function definitions
Wanneer je gebruik maakt van deze 3 regels krijg je geen copy'en van je objecten.

[ Voor 7% gewijzigd door Verwijderd op 15-07-2005 13:21 ]


Acties:
  • 0 Henk 'm!

  • Yo-han
  • Registratie: December 2001
  • Laatst online: 18-08 20:16

Yo-han

nope.

alienfruit schreef op vrijdag 15 juli 2005 @ 12:29:
Ja, ik heb inmiddels dat al geprobeerd, alleen het maakt geen verschil :( Ik heb de code hierboven aangepast.
Het kan aan mij liggen maar volgens mij word het gebruik van references in php4 klassen niet op deze manier toegelaten of werkt het gewoon niet. Geeft php geen errors als je je error_reporting op E_ALL zet?

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 01:32

alienfruit

the alien you never expected

Topicstarter
Ik heb het anders opgelost ;) Ik heb PHP5 op de webserver laten installeren, ik kijk later wel eens hoe ik dit ga oplossne voor de 4 versie van het systeem. Maar dat gebeurd voorlopg niet, heb het een beetje gehad nu met dat stuk :+

[ Voor 20% gewijzigd door alienfruit op 16-07-2005 00:28 ]

Pagina: 1