Above we write two lines of code in the class, or explicitly pass the array to the function. But considering that there is no difference between these two options in PHP3, we can still just treat the object model as one." Syntactic whitewashing" to access arrays. People who wanted to use PHP for object-oriented development, especially those who wanted to use design patterns, quickly found that they hit a wall. Fortunately, at the time (PHP3 era) there was no Too many people want to use PHP for object-oriented development.
PHP4 changes this situation. The new version brings the concept of reference, which allows different identifiers in PHP to point to the same address in memory. This means you can use two or more names for the same variable, as in Example 6.20.
Copy the code The code is as follows: $a = 5;
//$b points to the same place in memory as $a $b and $a point to the same address in memory
$b = & $a;
//we're changing $b, since $a is pointing to change $b, the address pointed to changes
//the same place - it changes too The address pointed to by $a also changes
$b = 7;
//prints 7 Output 7
print $a;
?>
Since building a network of objects pointing to each other is the basis of all object-oriented design patterns, this improvement has huge implications. While references allow for the creation of more powerful object-oriented applications, PHP's treatment of objects and other types of data the same way causes developers great pain. As any PHP4 programmer will tell you , the application will suffer from WTMA (Way Too Many Ampersands&) syndrome. If you want to build a practical application, you will feel extremely painful, look at Example 6.21 and you will understand.
Listing 6.21 Problems with objects in PHP 4 Problems using objects in PHP4
Copy code The code is as follows:
1 class MyFoo {
2 function MyFoo()
3 {
4 $this->me = &$this;
5 $this->value = 5;
6 }
7
8 function setValue($val)
9 {
10 $this->value = $val;
11 }
12
13 function getValue()
14 {
15 return $this->value;
16 }
17
18 function getValueFromMe()
19 {
20 return $this->me->value;
21 }
22 }
23
24 function CreateObject($class_type)
25 {
26 switch ($class_type) {
27 case "foo":
28 $obj = new MyFoo();
29 break;
30 case "bar":
31 $obj = new MyBar();
32 break;
33 }
34 return $obj;
35 }
36
37 $global_obj = CreateObject ("foo");
38 $global_obj->setValue(7);
39
40 print "Value is " . $global_obj->getValue() . "n";
41 print "Value is " . $global_obj->getValueFromMe() . "n";
Let's discuss it step by step. First, there is a MyFoo class. In the constructor, we give $this->me a reference and set it
We have three other member functions: a setter the value of this->value; one returns the value of this->value; the other returns the value of this->value->me. But isn't --$this the same thing? MyFoo::getValue() Isn't it the same as the value returned by MyFoo::getValueFromMe()?
First, we call CreateObject("foo"), which will return an object of type MyFoo. Then we call MyFoo::setValue(7). Finally , we call MyFoo::getValue() and MyFoo::getValueFromMe(), expecting to get a return value of 7.
Of course, if we get 7 in any case, the above example will not be the least meaningful in this book Example. So I’m sure you’ve guessed it – we don’t get two 7s.
But what result will we get, and more importantly, why?
What we will get is 7 respectively and 5. As for why --- there are three good reasons.
First, look at the constructor. When inside the constructor, we establish a reference between this and this->me. In other words, this and this ->me is the same thing. But we are inside the constructor. When the constructor ends, PHP needs to re-create the object (result of new MyFoo, line 28) and assign it to $obj. Because the object is not treated specially, it Like any other data type, assigning X to Y means that Y is a copy of X. That is, obj will be a copy of new MyFoo, which is an object that exists in the constructor. Obj->me How about it? Because it is a reference, it still points to the original object - this. Voila-obj and obj->me are no longer the same thing - changing one of them will not change the other.
That's the first reason. There are other reasons similar to the first one. Miraculously we are going to overcome the problem of instantiating objects (line 28). Once we assign the value returned by CreateObject to global_object, we still have to hit Same problem as above - global_object will become a copy of the return value, and again, global_object and global_object->me will no longer be the same. This is the second reason.
But, in fact, we can't go that far yet Far — Once CreateObject returns $obj, we will destroy the reference (line 34). This is the third reason.
So, how do we correct this? There are two options. One is to add ampersands everywhere, just Like Example 6.22 (lines 24, 28, 31, 37). 2. If you are lucky enough to use PHP5, you can forget all the above, PHP5 will automatically consider these for you. If you want to know how PHP5 If you consider these issues, continue reading.
Listing 6.22 WTMA syndrome in PHP 4 WTMA syndrome in PHP4
Copy code The code is as follows:
1 class MyFoo {
2 function MyFoo()
3 {
4 $this->me = &$this;
5 $this->value = 2;
6 }
7
8 function setValue($val)
9 {
10 $this->value = $val;
11 }
12
13 function getValue()
14 {
15 return $this->value;
16 }
17
18 function getValueFromMe()
19 {
20 return $this->me->value;
21 }
22 };
23
24 function &CreateObject($class_type)
25 {
26 switch ($class_type) {
27 case "foo":
28 $obj =& new MyFoo();
29 break;
30 case "bar":
31 $obj =& new MyBar();
32 break;
33 }
34 return $obj;
35 }
36
37 $global_obj =& CreateObject ("foo");
38 $global_obj->setValue(7);
39
40 print "Value is " . $global_obj->getValue() . "n";
41 print "Value is " . $global_obj->getValueFromMe() . "n";
PHP5 is the first PHP version to treat objects differently from other types of data. From a user's perspective, this proves to be very clear - in PHP5, objects are always passed by reference, while other types Data (such as integer, string, array) are all passed by value. Most notably, there is no need to use the & symbol to indicate passing objects by reference.
Object-oriented programming makes extensive use of object networks and inter-object connections. Complex relationships, these all require the use of references. In previous versions of PHP, references needed to be explicitly specified. Therefore, moving objects by reference is now the default, and objects are copied only when copying is explicitly requested, which is better than before .
How is it implemented?
Before PHP5, all values were stored in a special structure called zval (Zend Value). These values can be stored in simple values, such as numbers and strings. or complex values such as arrays and objects. When values are passed to or returned from functions, these values are copied, creating a structure with the same content at another address in memory.
In PHP5, the values are still Stored in a zval structure, except for objects. Objects exist in a structure called Object Store, and each object has a different ID. In Zval, the object itself is not stored, but the pointer to the object is stored. When copying a holder There is a zval structure of an object. For example, if we pass an object as a parameter to a function, we no longer copy any data. We just keep the same object pointer and notify the Object Store that this specific object now points to by another zval. Because The object itself is located in the Object Store, and any changes we make to it will affect all zval structures holding pointers to the object. This additional indirection makes PHP objects appear as if they are always passed by reference, using transparency and Efficient way.
Using PHP5, we can now go back to Example 6.21, remove all the ampersands, and everything will still work fine. When we hold a reference in the constructor (line 4) an & No symbols are needed.
http://www.bkjia.com/PHPjc/316925.htmlwww.bkjia.comtruehttp: //www.bkjia.com/PHPjc/316925.htmlTechArticle/* +--------------------- -------------------------------------------------- --------+ |=This article is Haohappy's notes from the chapter ClassesandObjects when reading CorePHP Programming |=Translation is mainly + personal...