类的声明
1、使用class关键字和一个任意的类名来声明类
2、类名可以是任意的字符和数字的组合,但不能以数字开头
3、和类关联的代码必需使用大括号括起来
4、类中包含属性和方法
//举例说明
<?
class person1{
var $name; // 成员属性
function say{//成员方法
echo '类中的方法';
}
}
?>
实例化类,使用属性,方法
1、实例化类 格式:$name = new classname();
2、使用属性 格式:$name -> 属性名称;
3、使用方法 格式:$name -> 方法名称;
//举例说明
<?
$person = new person1(); //实例化类
$person -> name;//使用类属性
$person -> say(); //使用类方法
?>
成员属性
1、类可以定义被称为属性的特定变量。属性与称为成员变量,用来存放对象之间互不相同的数据
2、类的属性和标准变量很相似,除了必须在声明和赋值前加一个代表可见性的关键字之外(它们决定了属性的了作用于)
3、public 、private、protected都是在PHP5中引进的,在PHP4中所有的属性都是用var来声明,在PHP5中也可以使用var
成员方法
1、属性对象存储数据,类方法则可以让对象执行任务。方法是类中声明的特殊函数。
2、调用属性方法是必须使用一对圆括号,即使没有参数
格式:
public/private/protected function funName ($args, $another){}
构造方法
1、在创建对象时构造方法(构造器)会被自动调用。
2、构造方法确保必要的属性被设置,并完成准备的工作。
3、在PHP5之前构造方法的名称需和所在类相同名字,在PHP5中构造方法命名为__construct();
4、构造方法减少了代码的重复,在使用new创建对象是否会被自动调用。
<?php
class person1{
public $name; //成员属性
function __construct($name){
$this->name=$name;
}
function say(){
return 'my name is '.$this->name;
}
}
?>
参数和类型
1、每个赋给变量的值都有一种类型
2、处理方法和函数的参数是,检查变量变的尤其重要
3、PHP5中引入了类的类型提示。
<?php
class person{
var $name;
function __construct($name){
$this->name=$name;
}
}
class student{
function say(person $name){//这里控制了必须是person类
echo 'my name is '.$name->name;
}
}
$person=new person('愚公移山');
$student=new student();
//$student->say('愚公移山');//会提示报错,说say方法必须是person中的参数
$student->say(new person('愚公移山'));
?>
继承
1、继承是从一个基类得到一个和多个类的机制
2、继承自另一个类的类称为该类的子类。子类也被称作为父类的扩展。
3、instanceof 用来判断一个实例化的类是否是某个指定对象的实例。
<?php
class person{
var $name;
function __construct($name){
$this->name=$name;
}
}
class student{
function say($name){
if($name instanceof person){
echo 'my name is '.$name->name;
}else{
echo 'it\'s not new to specail class';
}
}
}
$person=new person('lgzhyan');
$student=new student();
//$student->say($newPerson);//将会执行student中say方法的false区间代码
$student->say($person);
?>
4、继承父类必须使用extend关键字来继承
5、如果子类中没有__construct() 而父类中有,那么就会自动继承父类中的__construct()方法
6、子类默认继承父类所有的public和protected方法和属性
7、子类可以扩展和重写父类的方法
8、继承为确保一个类拥有自身的功能和父类的功能
9、“搜索”,在调用子类中不存在的方法时,自动查找父类中是否存在该方法,如果存在则调用,如果调用子类中存在的方法则直接调用子类中存在的方法
<?php
class person{
protected $name;
public $age;
function __construct($name,$age){
$this->name=$name;
$this->age=$age;
}
function say(){
echo 'this is parent class';
}
function run(){
echo $this->name.'is running';
}
}
class student extends person{
function say(){
echo 'my name is '.$this->name;
}
}
class teacher extends person{
}
$student=new student('lgzhyan',25);//子类中没有构造方法所以自动继承了父类的构造方法 里面已经加载进来了
$student->say();//输出my name is lgzhyan
$teacher=new teacher('lgzhyan',25);
$teacher->say();//输出this is parent class
$teacher->run();//输出lgzhyan is running;
?>
10、在子类中定义构造方法是,需要传递参数给父类的构造方法,否则得到的可能是个不完整的对象。
11、要调用父类中的方法可以使用parent关键字来引用父类本身,引用一个类而非一个对象的方式不是使用 -> 而是 ::
12、在子类中以父类的基础重写也需要使用到parent::
<?php
class person{
protected $name;
public $age;
function __construct($name){
$this->name=$name;
}
}
class teacher extends person{
function __construct($name,$age){
parent::__construct($name);//重载了父类的构造方法
$this->age=$age;
}
function say(){
echo 'my name is '.$this->name.' '.$this->age.' years old';
}
}
$teacher=new teacher('lgzhyan',25);
$teacher->say();//输出my name is lgzhyan 25 years old
?>
管理类的访问
1、public 关键字:任何地方都鞥访问public 方法和属性
2、private 关键字:只有在当前类中才能访问 private 方法和属性
3、protected 关键字:可以当前类和子类中访问 protected 方法和属性,其他外部代码无权访问
<?php
class person{
protected $name;
public $age;
private $sex;
function __construct($name,$sex,$age){
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}
}
$person=new person('lgzhyan','man',25);
echo $person->name;//提示:Fatal error: Cannot access protected property person::$name
echo $person->sex;//提示Fatal error: Cannot access private property person::$sex
echo $person->age;//输出25
?>
静态方法和属性
1、不仅可以通过对象访问方法和属性,还可以通过类来访问他们,这种方法就是静态类
2、静态类必须使用static关键字来声明
3、一个类中的静态方法不能访问这个类中的普通属性(那是属于一个类),但是可以访问静态属性
4、访问静态元素时不需要引用对象的变量 而是使用 :: 来连接属性或方法
5、要从当前类中访问静态方法或实行,可以使用self关键字指向当前类
6、不要实例化对象就能访问静态属性或方法
7、静态成员属性也可以就爱访问关键词
8、静态的成员方法中不能有任何动态的成员属性和成员方法
9、在类的内部可以使用 $this->静态方法名直接访问
10、在类的内部可以直接使用 self :: 静态方法名 去访问静态的成员方法
11、在类的内部可以直接使用类名 :: 静态方法名 去访问静态的成员方法
12、在类的外部可以实例化一个对象后 ,直接$ 对象 -> 静态方法名()
13、在类的外部可以直接使用类名 :: 静态方法名曲访问静态的成员方法
14、静态成员属性可以再类的外部直接使用类名 :: $静态属性名来访问
<?php
class person{
static public $name='lgzhyan';
static function say(){
echo 'my name is '.person::$name.'i can '.self::run();
}
static function run(){
return 'running';
}
}
echo person::$name;//输出lgzhyan
person::say();//输出my name is lgzhyani can running
?>
类常量
1、类的常量和全局常量性质相同
2、类的常量使用const来定义
3、访问类的常量使用 类名:: 常量名
4、类的常量名尽量大写
抽象类
1、抽象类不能被直接实例化
2、抽象类中只定义子类需要的方法
3、子类可以继承他并且通过其中的抽象方法具体化
4、使用abstract 来定义一个抽象类
5、大多数情况下抽象类至少包含一个抽象方法
6、可以象声明普通方法那样声明抽象方法,但是抽象方法不能有方法体
7、抽象类中的每个子类都必须实现抽象类中的所有抽象方法,或把他们自身也声明为抽象方法
8、在抽象方法当中,如果有参数,必须传入参数,如果有默认值,就必须传入默认值
<?php
abstract class person{
abstract function say($name='lgzhyan',$age);
}
class teacher extends person{
function say($name='lgzhyan',$age){
echo 'my name is '.$name.' '.$age.' years old';
}
}
$person=new person();//提示错误Fatal error: Cannot instantiate abstract class person
$teacher=new teacher();
$teacher->say('yanhaijing',25);//输出my name is yanhaijing 25 years old
?>
接口
1、作用:比如多人开发室,可能会调用其他人写的类。这是你可能不知道他的类中的方法的命名,这时查看接口就可以了
2、接口中的所有方法必须全部是抽象方法(没有方法体)
3、接口当中不能有动态的成员属性,成员属性只能是常量
4、接口继承使用 implements 来继承
5、一个类可以继承一个父类和任意多个接口,但extends 应该在 implements 前面
<?php
interface person{
public function say();
public function run();
}
class teacher implements person{
private $name;
private $age;
function __construct($name,$age){
$this->name=$name;
$this->age=$age;
}
function say(){
echo 'my name is '.$this->name;
}
function run(){
echo 'i am running';
}
}
$teacher=new teacher('lgzhyan',25);
$teacher->say();
?>
异常
1、PHP是从内置的Exception类中实例化得到的对象
2、Exception类型对象用于存放和报告错误信息
3、getMessage()获得传递给构造方法的字符串
4、getCode()获得传递给构造方法的错误代码
5、getFile()获得产生异常的文件
6、getLine()获得产生异常的行数
7、使用throw关键字和Exception对象来抛出异常。会停止当前方法。将错误返回给调用代码
8、抛出异常时可以使用try子句中将异常接收
9、try语句必须跟着一个catch子句才能处理错误
<?php
class getFile{
function getFiles($name){
try{
if(!fopen('r',$name)){
throw new Exception('文件不存在');
}
}catch(Exception $e){
echo $e->getMessage();
}
}
}
$files=new getFile();
$files->getFiles('text.txt');
?>
禁止继承
1、如果希望类或方法完成不变的功能,可以使用final关键字
2、final类不能有子类
3、final方法不能被重写
<?php
final class person{
}
//class teacher extends person{//提示Fatal error: Class teacher may not inherit from final class (person)
//}
class person1{
final function say(){
echo 'run';
}
}
class teacher1 extends person1{
function say(){//Fatal error: Cannot override final method person1::say()
}
}
?>
获取私有属性
1、获得私有属性值使用__get($name)
2、$name的值为要获得的属性名称
3、无论__get方法返回了什么,都会返回给客户端
<?php
class person{
private $name='lgzhyan';
function __get($name){
return $this->$name;
}
}
$person=new person();
echo $person->name;
?>
设置私有属性
1、在要设置私有属性值的时候使用__set($name,$value)
2、$name的值为要设置的属性名,$value的值为要设置的值
<?php
class person{
private $name='lgzhyan';
function __get($name){
return $this->$name;
}
function __set($name,$value){
return $this->$name=$value;
}
}
$person=new person();
$person->name='yanhaijing';
echo $person->name;
?>
查看方法是否存在
1、在对象的外部调用isset()函数时会被自动调用
2、查看是否被设置使用__isset($name)
<?php
class person{
private $name='lgzhyan';
function __isset($name){
if(isset($this->$name)){
echo '被设置';
}else{
echo '未被设置';
}
}
}
$person=new person();
isset($person->name);
?>
释放私有属性的值
1、在对象外部调用unset()函数时被自动调用
2、释放私有属性的值使用__unset()
<?php
class person{
private $name='lgzhyan';
function __unset($name){
unset($this->$name);
}
}
$person=new person();
unsset($person->name);
?>
调用未被定义的方法
1、在调用没有被定义的方法时,自动调用__call()方法
<?php
class person{
private $name='lgzhyan';
function __call($name,$args){
echo $name.' is not set';
}
}
$person=new person();
$person->test();
?>
析构函数
1、析构函数在销毁一个类之前执行(对象调用unset函数时,或进程不在引用对象时)
2、析构函数名必须是__destruct
3、析构函数不能带有任何参数
<?php
class person{
private $name='lgzhyan';
function __destruct(){
echo 'class is destory';
}
}
$person=new person();
?>
获取对象的副本
1、克隆一个对象使用__clone()方法
2、克隆方法建立一个与原对象拥有相同属性和方法的对象
3、__clone方法可以没有参数,它自动包含$this(副本)和$that(原本)两个指针
4、__clone方法在使用clone克隆对象时候自动调用
<?php
class person{
private $name;
function __construct($name){
$this->name=$name;
}
function say(){
echo 'my name is '.$this->name;
}
function __clone(){
$this->name='yanhaijing';
}
}
$person=new person('lgzhyan');
$newPerson=clone $person;
$person->say();
$newPerson->say();
?>
打印对象
1、当把对象传递给print,echo时会自动调用__tostring()方法
2、__tostring()方法必须拥有一个返回值
3、__tostring()方法可以用于设计专门用来传递信息的类,比如将异常、日志信息的总结写到__tostring方法中
<?php
class person{
private $name;
function say(){
echo 'my name is '.$this->name;
}
function __tostring(){
return 'this class is not have error';
}
}
$person=new person('lgzhyan');
echo $person;
?>
多态
1、多态是指一个公用接口后面维护多个实现
2、如果代码中存在大量的条件语句,就说明需要使用多态
interface pci{
function start();
function stop();
}
class soundCard implements pci{
function start(){
echo '声卡开始发声';
}
function stop(){
echo '声卡停止发声';
}
}
class netCard implements pci{
function start(){
echo '开始连接网络';
}
function stop(){
echo '断开网络连接';
}
}
class aCard implements pci{
function start(){
echo '显卡开始显示画面';
}
function stop(){
echo '显卡停止显示画面';
}
}
class cw{
protected $card;
function __construct($who,$func){
$this->card=new $who;
$this->$func();
}
function start(){
$this->card->start();
}
function stop(){
$this->card->stop();
}
}
$a=new cw('aCard','start');