读《PHP5 权威编程》第三章随感
时间:2008-01-16
来源:互联网
细读了《PHP5 权威编程》第三章,这一章的标题是PHP5面向对象语言,文中通过大量实例详尽阐述了PHP5中面向对象的基本语言构成和一些新的特性。从面向对象的基本模型到各种方法和语法的应用,从类的实例化到处理问题的小技巧,确实如书中所说:“如果你是刚刚接触PHP的,本章节将为你描述整个面向对象的模型。就算对PHP 4很熟悉,你也应该阅读本章,因为几乎所有OOP的内容都在PHP 5中被改变了。”以下是我读过本章后自己思考的几个问题:
1. PHP5的面向对象支持了通用的构造方法:__construct 给类的继承和代码的维护提供了便利,而为了兼容还保留了之前版本类同名方法为构造方法的方式,这也是PHP人性化的提现,但如果一个类包含了这两种构造方法会是什么样的呢?自己做了两个小实验(环境为windowxp/apache2.23/PHP5.25)
实验一:同时包含两类构造方法
PHP代码:
<?php
class newclass {
public $newvar;
function __construct() {
$this->newvar = 4;
}
function newclass() {
$this->newvar = 4;
}
}
$foo = new newclass();
var_dump($foo);
?>
一切正常,没有提示错误,说明二者共存是允许的。那么如果二者共存是否都被执行了呢?
实验二:两类构造方法是否都被执行
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();
?>
看来魔术构造方法存在是,类名同名构造方法就成为普通方法了
2. 对象创建时的返回值、引用和克隆:PHP4中创建对象时返回值即为对象本身,而PHP5中则是对象的ID号,这一点决定了PHP5中当A对象被赋予B对象时,传递的仅仅是对象的ID(句柄)而不是对象本身,需要复制对象时需要通过克隆来实现,这些特性应该是向JAVA学习来的。PHP对其他语言的学习和继承给予自身顽强的生命力,同时也给其他语言的程序员转向PHP提供了很大的便利(当然反之也是一样 :))
3. 《PHP5权威指南》的第三章仅仅是对面向对象的一些基础层面的阐述,更加深入的内容(如重载)在书的第四章中有所介绍。PHP对面向对象和面向过程两种设计思想的支持给予程序员更大的选择空间,将面向对象和面向过程合理的结合起来,让程序设计和执行更加高效,代码维护更加便捷。
顺便提出书中一些笔误
3.4节 实例代码中
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
作者: 僭燮水 发布时间: 2008-01-15
作者: 肥同小可 发布时间: 2008-01-16
对 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
PHP代码:
print $judy->getName();print $joe->getName();
关于对象不能直接转化为string 这个因为实例化返回值是句柄 而__toString方法在3.17节已有介绍
3.11节
PHP代码:
print " is a rectangle\n";顺便说一句 对于第三章代码 我没有测试任何一个 个人对于实例的态度是 读懂然后自己写
[ 本帖最后由 习明 于 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

http://www.phpchina.com/study/11/phpstudy.html
作者: 习明 发布时间: 2008-01-18
作者: hosander 发布时间: 2008-01-19
作者: 习明 发布时间: 2008-01-19
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28