__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);
parent
关键字加上做用域解析符(::)。public
protected
。若一个属性或方法被声明为受保护的protected
,就只能在本类或者其后代(即继承了包含受保护方法的类的那些类)内部访问它。private
,就只能在定义它的类内访问。这意味着,即使是子类,也不能访问该属性或方法。注意:在访问静态属性时,美圆符号($)要放在做用域解析符(::)以后。如:self::$count
,MyClass::plusone()
,MyClass::$count
等。php
文档块使用块注释的开头再多加一个星号的方式定义:jquery
/** * 这是一个最基本的文档块 * /
经常使用标签:git
@author
@copyright
——当前元素的版权年份及版权方名字@license
——当前元素的受权文件连接@var
——变量或类属性的类型和描述@param
——函数或方法的返回值类型及其描述。@return
——函数或方法的返回值类型及其描述。一个简单的例子:github
<?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; } } ?>
OOP的另外一个好处是它很是便于代码打包和分类。每一个类一般都放入一个单独的文件,若是采用统一的命令约定,访问一个类就极其简单。数据库
假设你有一个程序有150个类,这些类由程序根目录下的一个控制文件动态调用。全部这150个类文件都遵照一样的命名约定:class.classname.inc.php
,而且这些文件都被放在你应用程序的inc目录当中。数组
在这个控制文件中实现PHP的__autoload()
函数,就可以在某个类实例化时动态载入这个类,而没必要为了以防万一在控制文件中包含全部150个类,或者本身费心劳力地想别的办法来包含这些文件:函数
<?php function __autoload($class_name) { include_once('inc/class.'.$class_name.'.inc.php'; } ?>
把每一个类放到一个单独的文件,这样作很是有利于代码的移植,同时也使代码在新项目中重用更容易(无需大段复制粘贴代码)。oop
只要运用得当,OOP天生具备简洁紧凑的特色,与面向过程的代码相比,面向对象的代码定位和修改起来都很是容易。学习
若是某个信息数组增长了一个新的属性,面向过程代码可能须要修改每一个使用这个数组的函数(在最坏的状况下),以便增长这个属性。this
而面向对象的应用程序只须要添加新的属性,再添加上处理这个属性的方法,就能轻松地完成更新。