面向对象首先就要搞清楚什么是类,什么是对象。简单来说,类就是对事物抽象特点的定义,一个类中包含成员的数据形式以及对这些数据进行的操作。对象就是类的一个个具体例子。例如,我们可以把所有的汽车当成一个类,而宝马X3、奔驰AMG、奥迪A6这些车都是汽车类的对象。
在PHP中,使用class关键字跟上类的名字来对类进行定义。后面加一对花括号来对类中具体的成员和成员函数进行定义。类中变量使用var关键字来定义,而类中函数使用function关键字进行定义。
注:在PHP中,常用$this来代表自身对象。
使用关键字new来实例化一个对象
$obj = new MyFirstPhpClass;
实例化对象之后,每个对象都有了这个类的特征。
完整的创建类、实例化、和调用成员函数的例子(来源:runoob.com):
url = $par;
}
function getUrl(){
echo $this->url . PHP_EOL;
}
function setTitle($par){
$this->title = $par;
}
function getTitle(){
echo $this->title . PHP_EOL;
}
}
$runoob = new Site;
$taobao = new Site;
$google = new Site;
// 调用成员函数,设置标题和URL
$runoob->setTitle( "菜鸟教程" );
$taobao->setTitle( "淘宝" );
$google->setTitle( "Google 搜索" );
$runoob->setUrl( 'www.runoob.com' );
$taobao->setUrl( 'www.taobao.com' );
$google->setUrl( 'www.google.com' );
// 调用成员函数,获取标题和URL
$runoob->getTitle();
$taobao->getTitle();
$google->getTitle();
$runoob->getUrl();
$taobao->getUrl();
$google->getUrl();
?>
其中$this更像是一个变化的变量,他代表了当前实例化的对象。上述例子,在runoob对象中,里面的$this就都是$runoob。
与C++一样,PHP的构造函数也是用来给对象赋初值的。用法如下:
function __construct($形参1,$形参2,$形参3,......)
{
对形参执行的操作;
}
在实例化对象的时候,就可以将参数写进去了:
$a = new MyFirstPhpClass(1,2);
$b = new MyFirstPhpClass(2,3);
用法和C++一样,格式如下:
void __destruct(void)
使用extends关键字来继承一个类。PHP不能多继承,但是可以使用trait来近似实现一个多继承。格式如下:
class Child extends Parent
{
代码实现部分;
}
这样Child类就继承了Parent类。子类在继承基类的基础上增加了功能,称为派生。
如果子类从基类那里继承到的方法不能满足子类的需求,可以对该方法进行重写。重写时需要注意的是:子类方法的参数列表应该和基类重名方法的参数列表相同,否则应该成为重载而非重写。
访问控制分为三种:public、private和protected。public可以在任何地方被访问,private只能被所在的类访问,而protected可以被其所在类、子类、基类三者访问。
注:类的各种属性必须被定义为三者之一,如果使用var关键字定义,则默认为public。对于方法的访问控制也是相同的处理方式。
接口可以使某个类必须实现哪些方法,但是这些方法的具体内容不需要在接口中定义。定义接口的关键字是interface,格式与定义一个类一样,但是不需要写出方法的内容。要实现一个接口,使用 implements 操作符。
注:接口中的所有方法都必须是public类型。
interface myInterface
{
function a($var1,$var2);
}
class myClass implements myInterface
{
function a($var1,$var2)
{
return $var1+$var2;
}
}
类中始终保持不变的量可以将其定义为常量。定义常量的时候不需要$符号。常量必须是一个定值。
class myClass{
const constant='001';
}
调用常量的时候需要使用::符号,例如
class myClass{
const constant='001';
}
$a = new myClass();
echo $a::constant;
如果一个类中含有抽象方法,那么这个类必须声明称抽象类。(一个抽象类的所有方法中既有可能有抽象方法,也有可能有非抽象方法)被定义成抽象方法的方法只是声明了调用方式,并不能实现具体功能。抽象方法是所有子类都需要定义的方法。
注:抽象类不能实例化。
把类的属性或者是方法声明成静态以后就可以不用实例化而直接访问了。其中,静态属性是不能通过一个已经实例化的对象来访问的,而静态方法则是可以的。
注:由于静态方法不需要实例化就能访问,所以说在静态方法里面$this这个伪变量就不好使了。
在PHP中,如果基类(父类)中的一个方法被声明成了final方法,则在继承的子类里面无法对这个方法进行覆盖。而一个类被声明称了Final类时,这个类是不能被继承的。
PHP中子类默认是不会调用父类的构造函数的。如果希望子类来调用父类的构造函数时,应该在子类的构造函数里面加上parent::__construct(),这样就能实现在子类中调用父类的构造函数了。
可以用一个变量来动态的对类进行调用
class myClass{
var $a=1;
}
$mC="myClass";
echo $mC->a;