php笔记(面向对象)

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

    /*
     * 静态延迟绑定,
     *  self::    当类加载在内存时,绑定对应的类
     *  static::  当类被使用时,绑定使用的类
     */

    class Human01{
        public static $name = 'human';
        public static function f1(){
            echo self::$name;   //human
            echo static::$name; //man
        }
    }
    class Man extends Human01 {
        public static $name = 'man';
    }

    //此时Man是Human的子类,并且重写了name静态属性,然后调用父类的f1方法
    //调用者为Man类,所以static指代为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{
        //T1,T2的代码会被加载进类c
        use T1,T2{
			T1:: f1 insteadof T2; //使用T1中的f1,不使用T2中的f1方法
   		    T2:: f1 as ft1;       //对T2中的f1 方法起别名,
		};
    }
重载(魔术方法)
语法:__方法名
定义:在某些特殊情况下会自动触发的方法,指魔术方法
目的:为保护程序正确运行而提供的一种容错机制
属性重载:
	__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/>'; //$k为属性名,$v为属性值
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值