《深入PHP与jQuery开发》读书笔记——Chapter3
《深入PHP与jQuery开发》第三章学习笔记
1.PHP的魔术方法(在对象中发生某些例行事件时会自动调用这些方法)
- PHP提供了魔术方法
__construct()
(构造函数),在新对象被创建时会被自动调用; - 要在对象被销毁时自动调用一个函数,可以使用
__destruct()
(析构函数)的魔术方法。在需要做类清理工作(例如,关闭数据库连接)时它就非常有用。 - 要显式地触发析构行为,可以用
unset()
函数销毁这个对象。 - 将类输出为字符串,要将
MyClass
类输出为一个字符串而不发生错误,需要定义另一个魔术方法__toString()
。如果没有定义__toString()
方法就输出对象会发生致命错误(程序停止运行)。在没有定义__toString()
方法的情况下用echo
指令输出对象:
<?php
class MyClass {
public $var = "MyClass";
public function __construct() {
echo 'The class "',__CLASS__,'" was initialized!<br/>';
}
public function __destruct() {
echo 'The class "',__CLASS__,'" was destroyed!<br/>';
}
public function __toString() {
echo "Using the toString method: ";
return __CLASS__;
}
}
$myclass = new MyClass;
var_dump($myclass); //直接打印类变量
echo $myclass; //调用__toString方法
unset($myclass);
2.继承与派生
- 2.1.要改变新类中继承来的属性或者方法,只需要在新类中重新声明这个属性或方法,就可以简单地覆盖掉它。
- 2.2.如果是要覆盖时保留被覆盖方法的功能,只需要在保留原方法功能的基础上,要为继承得来的方法添加新功能,使用
parent
关键字加上作用域解析符(:😃。
3.属性或方法的可见度
- 3.1.公开的属性和方法
public
- 3.2.受保护的属性和方法
protected
。若一个属性或方法被声明为受保护的protected
,就只能在本类或者其后代(即继承了包含受保护方法的类的那些类)内部访问它。 - 3.3.一个属性或方法若被声明为
private
,就只能在定义它的类内访问。这意味着,即便是子类,也不能访问该属性或方法。 - 3.4.一个方法或属性若被声明是静态的,则不需要生成类的实例就可以访问它。只需要提供类的名字,加上作用域解析符和属性或方法的名字即可。使用静态属性的最大的好处是,在脚本的生命期内它们能记住自身储存的值。这意味着如果修改了一个静态属性,并稍后在脚本中访问它,修改后的值仍然在。
注意:在访问静态属性时,美元符号($)要放在作用域解析符(::)之后。如:self::$count
,MyClass::plusone()
,MyClass::$count
等。
4.文档块注释
文档块使用块注释的开头再多加一个星号的方式定义:
/**
* 这是一个最基本的文档块
* /
常用标签:
@author
@copyright
——当前元素的版权年份及版权方名字@license
——当前元素的授权文件链接@var
——变量或类属性的类型和描述@param
——函数或方法的返回值类型及其描述。@return
——函数或方法的返回值类型及其描述。
一个简单的例子:
<?php
/**
*
* 一个简单的类
* @author Sysublackbear
* @copyright 2014 SYSU
* @license http://sysublackbear.github.io
* /
class SimpleClass {
/**
* 一个公开变量
*
* @var string 保存类的数据
*/
public $foo;
/**
* 在类实例化时给$foo赋一个新值
*
* @param string $var一个必须提供的值,供类初始化使用
* @return void
* /
public function __construct($val) {
$this->foo = $val;
}
/**
* 两个整数相乘
*
* 接受一对整数作为参数,返回它们的积
*
* @param int $bat一个数字
* @param int $baz一个数字
* @return int两个参数的积
* /
public function bar($bat,$baz) {
return $bat*$baz;
}
}
?>
5.采用OOP对代码进行更好的组织
OOP的另一个好处是它非常便于代码打包和分类。每个类通常都放入一个单独的文件,如果采用统一的命令约定,访问一个类就极其简单。
假设你有一个程序有150个类,这些类由程序根目录下的一个控制文件动态调用。所有这150个类文件都遵守同样的命名约定:class.classname.inc.php
,并且这些文件都被放在你应用程序的inc目录当中。
在这个控制文件中实现PHP的__autoload()
函数,就能够在某个类实例化时动态载入这个类,而不必为了以防万一在控制文件中包含所有150个类,或者自己费心劳力地想别的办法来包含这些文件:
<?php
function __autoload($class_name) {
include_once('inc/class.'.$class_name.'.inc.php';
}
?>
把每个类放到一个单独的文件,这样做非常有利于代码的移植,同时也使代码在新项目中重用更容易(无需大段复制粘贴代码)。
6.采用OOP更容易维护
只要运用得当,OOP天生具有简洁紧凑的特点,与面向过程的代码相比,面向对象的代码定位和修改起来都非常容易。
如果某个信息数组增加了一个新的属性,面向过程代码可能需要修改每个使用这个数组的函数(在最坏的情况下),以便增加这个属性。
而面向对象的应用程序只需要添加新的属性,再添加上处理这个属性的方法,就能轻松地完成更新。