+ -
当前位置:首页 → 问答吧 → 读《PHP5 权威编程》第三章随感

读《PHP5 权威编程》第三章随感

时间:2008-01-16

来源:互联网

面向对象作为一种程序设计思想,被众多编程语言所支持。PHP5彻底的改变了PHP语言对面向对象的支持,使整个PHP语言在面向对象方面丰满起来。
        细读了《PHP5 权威编程》第三章,这一章的标题是PHP5面向对象语言,文中通过大量实例详尽阐述了PHP5中面向对象的基本语言构成和一些新的特性。从面向对象的基本模型到各种方法和语法的应用,从类的实例化到处理问题的小技巧,确实如书中所说:“如果你是刚刚接触PHP的,本章节将为你描述整个面向对象的模型。就算对PHP 4很熟悉,你也应该阅读本章,因为几乎所有OOP的内容都在PHP 5中被改变了。”以下是我读过本章后自己思考的几个问题:
        1. PHP5的面向对象支持了通用的构造方法:__construct 给类的继承和代码的维护提供了便利,而为了兼容还保留了之前版本类同名方法为构造方法的方式,这也是PHP人性化的提现,但如果一个类包含了这两种构造方法会是什么样的呢?自己做了两个小实验(环境为windowxp/apache2.23/PHP5.25)
        实验一:同时包含两类构造方法
复制PHP内容到剪贴板
PHP代码:

<?php
                class newclass {
                    public $newvar;
                
                    function __construct() {
                        $this->newvar = 4;
                    }
                    
                    function newclass() {
                            $this->newvar = 4;
                    }
                }
                $foo = new newclass();
                var_dump($foo);
                ?>

测试结果:object(newclass)#1 (1) { ["newvar"]=> int(4) }
        一切正常,没有提示错误,说明二者共存是允许的。那么如果二者共存是否都被执行了呢?
        实验二:两类构造方法是否都被执行
复制PHP内容到剪贴板
PHP代码:

<?php
                class newclass {
                    public $newvar;
                
                    function __construct() {
                        $this->newvar = 'magic ';
                        echo $this->newvar;
                    }
                    
                    function newclass() {
                            $this->newvar = 'name ';
                        echo $this->newvar;
                    }
                }
                $foo = new newclass();
                ?>

测试结果:magic
        看来魔术构造方法存在是,类名同名构造方法就成为普通方法了
        2. 对象创建时的返回值、引用和克隆:PHP4中创建对象时返回值即为对象本身,而PHP5中则是对象的ID号,这一点决定了PHP5中当A对象被赋予B对象时,传递的仅仅是对象的ID(句柄)而不是对象本身,需要复制对象时需要通过克隆来实现,这些特性应该是向JAVA学习来的。PHP对其他语言的学习和继承给予自身顽强的生命力,同时也给其他语言的程序员转向PHP提供了很大的便利(当然反之也是一样 :))
        3. 《PHP5权威指南》的第三章仅仅是对面向对象的一些基础层面的阐述,更加深入的内容(如重载)在书的第四章中有所介绍。PHP对面向对象和面向过程两种设计思想的支持给予程序员更大的选择空间,将面向对象和面向过程合理的结合起来,让程序设计和执行更加高效,代码维护更加便捷。
        
        顺便提出书中一些笔误
        3.4节 实例代码中
复制PHP内容到剪贴板
PHP代码:
$judy = new Person("Judy") . "\n";
                $joe = new Person("Joe") . "\n";

两个语句存在语法错误,原版和中文版均存在
        3.11节 第一段实例代码后面的说明中
        'Square is a rectangle\n'应为出'Square is a rectangle'
        同样是两个版本均存在

        通过学习这一章,对于PHP5的面向对象有了一些新的认识和理解。中国有句古话:“尽信书不如无书”。如果学习仅仅停留在书本上是不可能成为合格的程序员的,实践出真知,希望与大家共同进步!

[ 本帖最后由 习明 于 2008-1-15 22:27 编辑 ]

作者: 习明   发布时间: 2008-01-15

习明写的很深刻啊

作者: blankyao   发布时间: 2008-01-15

学习了

作者: lu5266   发布时间: 2008-01-15

专业路过 MJJ的贴

作者: 僭燮水   发布时间: 2008-01-15

写的不错!

作者: 肥同小可   发布时间: 2008-01-16

LZ看来看的很仔细而且对代码也做了测试,这点很好学编程重在动手动脑
对  3.4节 我想对LZ的提出的问题解释一下
  这段代码我在ZEND STUDIO中实测了,确实存在问题借助提示我分析了一下原因(看问题要知其然,更要知其所以然吗)。
  输出提示说“person类对象不能转换为string类型”,对语句的分析可以看出赋值语句右边先生成了一个对象而后通过连字符“.”连接一个string类型,由于php是弱类型语言,类型之间多可以转换,这里php试图将对对象转换成string类型,结果失败并报错。也证明对象不能简单转换成string。
  这又令我想起两点一个是PHP中对象是否能转换成字符串;二是php中的异常处理;第一个我发现了_tostring()方法,这个在本书中有(静静期待中。。。)。第二个同上。
  LZ提的第二个问题个人认为没有错啊,请LZ多多检查啊。“\n”只是个换行符(文本的,不是HTML)在ZEND STUDIO中输出多行文本,中间加入这个你就会”看“到它的。

作者: jfcat   发布时间: 2008-01-16

3.4节的错误很明显 类实例化的时候结尾的 ."\n" 是明显的语法错误 我前面说了是笔误 因为作者的原意应该是这两处 ."\n"是加在后文
复制PHP内容到剪贴板
PHP代码:
print $judy->getName();
print $joe->getName();

这两句的
关于对象不能直接转化为string 这个因为实例化返回值是句柄 而__toString方法在3.17节已有介绍
3.11节
复制PHP内容到剪贴板
PHP代码:
print " is a rectangle\n";

此句中使用的是" 所以\n会被视为转义 正常的浏览器显示应该是不可见的 之所以我也说是笔误 因为作者在本章其他实例中也使用了类似的语句而输出结果中并未出现 "\n" 可以参见3.10节实例

顺便说一句 对于第三章代码 我没有测试任何一个 个人对于实例的态度是 读懂然后自己写

[ 本帖最后由 习明 于 2008-1-16 10:55 编辑 ]

作者: 习明   发布时间: 2008-01-16

力顶小明,小明的意思是:
$judy = new Person("Judy") . "\n";
$joe = new Person("Joe") . "\n";

print $judy->getName();
print $joe->getName();
这段代码中的. "\n"应该加在后面两句,成为:
$judy = new Person("Judy");
$joe = new Person("Joe");

print $judy->getName() . "\n";
print $joe->getName() . "\n";

小明真是细心啊,俺对小明的敬仰之心犹如……

作者: kelystor   发布时间: 2008-01-16

引用:
原帖由 kelystor 于 2008-1-16 15:17 发表
力顶小明,小明的意思是:
$judy = new Person("Judy") . "\n";
$joe = new Person("Joe") . "\n";

print $judy->getName();
print $joe->getName();
这段代码中的. "\n"应该加在后面两句,成为:
$judy = n ...
过奖啦

作者: 习明   发布时间: 2008-01-16

楼主是个很细心的人,有了这份细心,没有你办不到的事!

作者: eclanp   发布时间: 2008-01-17

刚刚发现 PHP进阶学习第11期上线了 内容恰好是对象模型 可以这一章内容相互补充
http://www.phpchina.com/study/11/phpstudy.html

作者: 习明   发布时间: 2008-01-18

谢谢楼主。考虑到尊重原版,我们会向英文原版提出这样的问题。

作者: hosander   发布时间: 2008-01-19

感谢简老师的回复和辛勤劳动

作者: 习明   发布时间: 2008-01-19

热门下载

更多