类
php中的类可以类比java中的类,特有的特性如下:
1. 定义常量时,只能使用:const 常量名,且实例对象无法使用常量
注:如果要访问常量,需要范围解析操作符 ::
类名 :: 常量
2. 定义方法使用function关键字,
注:
如果方法需要访问类中属性,需要定义参数
或,通过关键字 global $属性名 来进行调用
或,通过 $this 来调用类中属性
3. 实例对象可以自行添加和删除类的属性,但不会改变原有类的属性,只影响实例对象本身
注:删除:unset($对象名 -> 属性名)
添加:$对象名 -> 属性名 = 值
调用类中方法:$对象名 -> 方法名(参数1,参数2,.....)
4. 对象传值:
对象传值 等同于 引用传值
5. 静态属性(static)
类可以直接访问,
无法在普通的成员方法中访问静态方法和属性
无法在静态的成员方法中访问普通方法和属性
类名 :: 静态属性名/静态方法名
6. self关键字
只能在类中进行使用
用来代替范围解析操作符中的类名
可以代替类名用来实例化
self :: 静态属性名/静态方法名
7. 类的加载(引入)
include_once 'php文件路径'
自动加载:
function __autoload($val){
include_once $val . '.php'
}
php7以后,推荐使用spl_autoload_register()来加载:
function my__autoload ( $classname ) {
$c_file = 'c/' . $classname . '.php' ;
if ( file_exists ( $c_file ) ) {
include_once $c_file ;
} else {
$m_file = 'c/' . $classname . '.php' ;
if ( file_exists ( $c_file ) ) {
include_once $m_file ;
}
}
}
spl_autoload_register ( 'my__autoload' ) ;
类实现自动加载:
class AutoLoad {
public static function loadC ( $classname ) {
$c_file = 'c/' . $classname . '.class.php' ;
if ( file_exists ( $c_file ) ) require_once $c_file ;
}
public static function loadM ( $classname ) {
$m_file = 'c/' . $classname . '.class.php' ;
if ( file_exists ( $m_file ) ) require_once $m_file ;
}
}
spl_autoload_register ( array ( 'AutoLoad' , 'loadC' ) ) ;
spl_autoload_register ( array ( 'AutoLoad' , 'loadM' ) ) ;
克隆对象:
1. 使用关键字:clone
2. $对象a = clone $对象b
3. 和对象赋值不同,克隆对象不是同一个对象,有不同的内存空间。
4. 类中可以定义一个克隆方法 __clone(),克隆对象产生时会自动调用次方法
5. 被 private 修饰的克隆方法无法在,外部克隆对象产生时自动调用
面向对象三大特性
继承
1. 子类继承父类的公有,受保护的属性,但不继承私有方法
2. 子类允许访问父类静态常量和方法
3. 子类重写父类时,不会覆盖父类的方法,使用 parent:: 方法名 来使用父类的被重写的方法
4. 子类只能继承一个父类,想要多继承只能链式继承
封装
可以想想黑盒模型
多态(php不支持)
php是弱类型,不存在变量的强制类型,因此php不支持多态
静态延迟绑定 static:: , self::
<?php
class Human01 {
public static $name = 'human' ;
public static function f1 ( ) {
echo self: : $name ;
echo static : : $name ;
}
}
class Man extends Human01 {
public static $name = 'man' ;
}
Man: : f1 ( ) ;
final关键字
语法1:final class 类名{}
被 final 修饰的类不能被继承
语法2:public final function f1(){}
被 final 修饰的方法不能被继承
Abstract 关键字
语法1: abstract class 类名 {}
被 abstract 修饰的类不能被实例化
语法2:public abstract function()
2-1. 被 abstract 修饰的方法必须在 抽象类中,不能有方法体 ,必须为 public 或者 protected
2-2. 抽象方法必须被子类重写
interface关键字
语法1:interface 类名{}
被 interface 修饰的类不能被实例化
接口类中只能有常量和抽象方法
接口可以多继承
trait代码复用
Trait是为单继承语言准备的代码复用的复用机制
语法1:trait 类名{}
语法2:trait内部可以拥有一个类能拥有成员属性(包括静态),成员方法(包括静态),不能有常量
语法3:使用 use 关键字加载 trait类
语法4 :如果多个 trait 中有相同的方法,
1. 使用 instradof 来替代
2. 使用 as 来起别名
注:as需要在instradof后使用
特性1 : 无法被实例化
特性2 :一个类可以使用多个trait
特性3:类中不允许定义和trait同名的属性
特性4:类中可以定义和trait同名的方法,并且会覆盖trait中的方法
特性5:如果父类定义和trait同名的方法,trait中的方法会覆盖父类的方法
特性6:可以定义抽象方法
trait T1 {
public $t1 ;
private $t1_1 ;
public function f1 ( ) {
echo __FUNCTION__ ;
}
private function f2 ( ) {
echo __FUNCTION__ ;
}
}
trait T2 {
public $t2 ;
private $t2_2 ;
public function f1 ( ) {
echo __FUNCTION__ ;
}
private function ft2 ( ) {
echo __FUNCTION__ ;
}
}
class c {
use T1 , T2 {
T1 : : f1 insteadof T2 ;
T2 : : f1 as ft1;
} ;
}
重载(魔术方法)
语法:__方法名
定义:在某些特殊情况下会自动触发的方法,指魔术方法
目的:为保护程序正确运行而提供的一种容错机制
属性重载:
__get($key):读属性的时候触发
__set($key,$value):写属性的时候触发
__isset($key):外部调用isset()函数或者empty()函数时触发
__unset($key):外部调用unset()结构删除对象属性时自动触发
__toString():对象被当作普通变量输出或者连接时自动调用
方法重载:
__call($function_name[,$args]):对象调用不可调用方法时触发
__callStatic($function_name[,$args]):类访问不可调用静态方法时触发
对象遍历foreach
定义:遍历对象,指将对象中的所有公有属性,以键值对的形式取出并访问。
语法:foreach($m as $k => $v){}
$m 为对象,$k为属性名,$v为属性值
class Man {
public $name = 'lis' ;
public $age = 12 ;
public $gender = 'nv' ;
public $weight = 140 ;
public $money = 1000 ;
}
$m = new Man ( ) ;
foreach ( $m as $k = > $v ) {
echo $k . ' : ' . $v . '<br/>' ;
}