一、构造函数
因为可以使用默认值,所以PHP 中构造函数只有一个,若需带参构造函数,同时可使用无参构造函数,则参数设置默认值即可。
PHP 4中:构造函数名与类名同
class Sum{
function Sum($x=0,$y=0){
$sum=$x+$y;
echo "sum:".$sum;
}
}
PHP 5中:构造函数与析构函数分别为__construct()与__destruct(),(注意为双下划线)
class Sum{
function __construct($x=0,$y=0){
$sum=$x+$y;
echo "sum:".$sum;
}
function __destruct(){...}//析构函数在unset()时调用
}
PHP 4与PHP 5兼容的写法可为:
class Sum{
function __construct($x=0,$y=0){
Sum($x,$y);
}
function Sum($x=0,$y=0){
$sum=$x+$y;
echo "sum:".$sum;
}
function __destruct(){...}//析构函数在unset()时或没有引用指向时自动调用
}
二、构造函数与继承
PHP 4不会从派生的类中自动地调用父类的构造函数,同时它不关心构造函数是否在本类中定义:
class A{
function A(){...}//A类的构造方法
function B(){...}//A类的普通方法
}
class B extends A{
function C(){...}//C类的普通方法
}
//下面在PHP 4 中将调用A类的方法B()作为B类的构造方法
var $b=new B();
而PHP 5中子类没有指定构造方法时,将自动调用父类的构造方法。
三、类的成员变量
PHP 4中,类的变量初始化不能包含变量:
1、成员变量的声明与初始化:
PHP4 中:
<?php
/* PHP 4 中不能这样用 */
class Cart {
var $todays_date = date("Y-m-d");
var $name = $firstname;
var $owner = 'Fred ' . 'Jones';
/* 不过包含有常量的数组可以 */
var $items = array("VCR", "TV");
}
/* 应该这样进行 */
class Cart {
var $todays_date;
var $name;
var $owner;
var $items = array("VCR", "TV");
function Cart() {
$this->todays_date = date("Y-m-d");
$this->name = $GLOBALS['firstname'];
/* etc. . . */
}
}
?>
PHP 5中:
class Sum{
//说明:使用static或public等关键字时,声明处不能使用var。
[public] static $sum=0; //声明静态变量
var $x=0; //声明普通变量,var不能省略(此方法为兼容PHP 5之前的版本,默认public)
[public/protected/private] [static] $z=0; //声明变量
function __construct(){}
function __destruct(){}
[public/protected/private] [static] function method(){}//声明方法
}
$this->varName;//类中方法访问成员变量
$a=new A();
$a->varName;//类的对象访问可访问的成员变量
说明:
正如从为了根目录访问每个文件需要输入该文件的完整的路径名一样,必须指定需要调用的函数的完整名称:在 PHP 术语中,根目录将是全局名字空间,路径名符号将是 ->。因而,名称 $cart->items 和 $another_cart->items 命名了两个不同的变量。注意变量名为 $cart->items,不是 $cart->$items,那是因为在 PHP 中一个变量名只有一个单独的美元符号。
3、关于$this的说明
如果其所在的方法是被静态调用的话,伪变量 $this 通常未定义。但这不是个严格规定:如果一个方法被从另一个对象内静态调用的话,则 $this 会被定义。此时 $this 的值是那个发出调用的对象。可通过isset()检查是否已定义。
A::B();//静态调用A类中的方法B。B()中使用的$this未定义。
$a=new A();
$a->B();//非静态调用。B()中使用的$this指发出调用的对象。
说明:PHP 4中因为没有使用static 关键字,所以一般方法与成员变量也可使用静态调用。但PHP 5中有严格要求。
四、self与parent
self指类中本类的名字,因而访问方法或成员变量(PHP 4中)或访问静态方法或静态变量(PHP 5中)可以使用下列形式:
self::A();//PHP4中访问方法A或PHP5中访问静态方法A
self::$x;//PHP4中访问成员变量$x或PHP5中访问静态成员变量$x
同理,parent代指所继承的父类的类名。访问规则同上。
五、访问权限控制
由PHP 5开始引入。
public:可在任何地方被访问;
protected:自身类及子类与父类中可被访问;
private:自身类可访问。
class Car {
public $speed = 10;
//在这里使用重载实现speedDown方法
public function __call($name,$args){
if($name=='speedDown'){
$this->speed-=$args[0];
}
}
}
$car = new Car();
$car->speedDown(5); //调用不存在的speedDown方法
echo $car->speed;
class A {
var $items;
}
$c=new A();
$c->x=5; //x不存在,属性重载
echo $c->x;
$c->items[0]=10; //此处也进行了重载
echo $c->items[0];
print_r($c->items);