PHP面向对象基本概念

注意:此文档只是适合初学者、小白的阅读。初学PHP面向对象的时候的一些总结。


 $ 是变量符号。所以 $lisi->$name 是不对的,值存在一个 $ 就OK了,$lisi->name 才是正确的!!!!!


1.  PHP5 属于面向对象,只考虑对象
C    属于面向过程,比较繁琐,考虑步骤


2.对象调用变量/属性 echo $a->name; $a['name']
  对象调用方法 $a->cay();


3.属性/变量  必须是8中类型中的值( 
标量类型(整形/浮点型/字符串型/布尔型) 
复合类型(数组/对象(对象包含属性和方法,$user=new Person();))
特殊类型(资源(连接数据库资源、文件打开、目录打开,$conn=mysql_connect("localhoat", "root", "123456");)/null))
)。默认为null,不能是表达式的值或者函数的返回值(但是java可以)


4. 函数不能重复定义,不能是系统函数(time),
在类中可以随意定义,但是在内部调用函数需要$this,否则会调用外部函数
在类的外部调用函数,直接new出一个新的对象,直接调用$a->age();


5. 构造函数 __construct(); 只能存在一个,new出对象是发生作用,利用构造函数传参是,方法中的参数必须一致
构造函数特别适合在new出现对象之前,需要对类做的一些初始化工作


析构函数 __destruct();  对象销毁(内存不需要)时自动执行,
析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

手动销毁:unset($a); $b=false; $c=null;
自动销毁:程序执行到最后一行的时候,程序自动回收,把指向的路径删除了。
只要有一个对象指向内存,内存就不会被unset掉,


面向对象三大特征 封装 继承 多态(可拔插性)



6.封装 private protected public 
//这个存在一些不懂的问题:权限修饰是存在bug的,我可以通过类中的其他公共方法,通过$this来得到类中的私有属性,但是建议不要这么做


7.mysql类的封装 具体商城中的mysql.class.php中可以看到
连接数据库(利用参数传参(1.使用配置文件,例如商场    2.利用__construct()))



8.继承 extends
一个子类只能继承一个父类,把所有属性继承过来(但是不能访问父类的私有属性,私有属性只有一块内存),
 并且对父类的数据进行访问修改
parent:: 在父类中直接调用,而不用重新new一个
::指的是调用类中的 静态 方法
范围解析操作符(::)   当在 类的外部 访问这些静态成员、方法和常量时,必须使用类的名字
self::     parent::






9.构造方法的继承
子类继承过来之后,要先使用 parent::__construct(); 把父类构造函数显示出来,因为子类的构造函数会覆盖父类
在java中,实例化子类的时候,会自动先调用父类的构造函数的


10.继承和封装
public  可以在类外调用
protected 可以在继承的子类中访问
private   只可以在类内部访问
private protected public 
本类中 Y Y Y
子类中 N Y Y
外部 N N Y



11. 多态 
php 本身就是多态(变态)
因为它本身是不检测类型的,要求不严格,java属于强类型语言,要求严格
($var = 8; PHP中对$var没有限制,8种类型中都可以
    int var = 8; java中的已经对var进行了限制)
多态就是 抽象的声明分类,具体的工作由子类继承过来来做.
里氏代换:凡是可以用父类解决的问题,都是可以由子类来替代解决的。


12.静态属性和方法 static (只有一个)
static 存放在类中,使用类访问 Human::$name,静态方法调用时可以不用产生类的实例,直接通过 Human::cry() 调用
  普通属性存放在对象中 $lisi->name; 
类(class) 一旦声明完毕,static属性和方法就存在了,而且只存在一个



类本身可以访问(::) 静态方法 和 静态属性 
但是不可以访问 动态方法(可以,但是不支持,会警告) 和 动态属性

动态方法(类本身中的或者new出来的)可以访问($this) 静态方法 ,但不支持静态属性
可以访问动态方法以及动态属性


类访问是通过 :: 访问
类中的方法访问用 $this-> 访问
new出的对象访问用 $lisi-> 访问(其实也就是$this)


静态方法 静态属性 动态方法 动态属性
类(::)   OK OK OK(不支持) NO
动态方法($this) OK NO OK   OK
new对象($this) OK NO   OK     OK (同上)
静态方法($this)   静态方法中不允许使用$this


13. self::$静态属性/静态方法  本类, $this是本对象
parent::$静态属性/静态方法


14.单例模式
1.只有一个实例,static的唯一性原则
2.protected __construct() ,防止外部new的对象太多,但此时成了 0例了,不是单例了
3.利用静态接口,通过自身new出的一个对象供外界使用

class single{
		static protected $ins = NULL;


		protected function __construct(){ //protected 的构造函数可以防止外界new出很多
		}


		static public function getInstance(){ //satatic保证唯一性,通过这个接口实例化,并且供外界访问
			if (self::$ins instanceof self) { //查看$ins在self中是否已经实例化了
				return self::$ins;
			}
			self::$ins = new self();
			return self::$ins;
		}
	}


	$s1 = single::getInstance(); //通过静态调用访问public方法


15.单例模式中的一些问题
覆盖:被继承的子类的方法和属性可以用相同的名字重新声明。
但是如果父类加了final 该方法不可以覆盖,可以通过 parent:: 来覆盖
final 可以修饰 类 和 方法, 不可以修饰属性
final 修饰类,该类不能被继承
final 修饰方法,该方法不能被子类所覆盖
覆盖方法的时候,参数必须保持一致,否则会警告
但是构造函数被覆盖的时候可以使用不同的参数 //这个有点不太懂

范围操作符 :: 作用: 访问静态常量、类成员、覆盖类中的属性和方法
self::   始终调用自身的静态属性或者静态方法
parent::   调用父类的静态属性或者静态方法,一步一步向父类找
static::(延迟绑定)  调用最终的静态属性或者静态方法,一开始的会被覆盖掉


当一个子类覆盖其父类中的方法时,PHP 不会调用父类中已被覆盖的方法。是否调用父类的方法取决于子类。
这种机制也作用于构造函数和析构函数,重载以及魔术方法。


16.魔术方法(自动调用, 以 __ 开头)
__construct() 构造函数
__destruct() 析构函数
__clone() 克隆方法  当龙方法不存在的时候调用 __clone(),另外再copy一份对象


方法重载
__call() 调用(->)一个不可访问的方法(未定义或不可见), __call()被调用,返回方法名字和属性
__callStatic()用静态方式(::)调用一个不可访问的方法是,会调用 __callStatic()


属性重载(只能在对象(new)中实行,在静态方法中不能被调用,所以不能为static)
__get() 读取未定义变量(无权访问或者不存在),会调用
__set() 给未定义变量赋值时
__isset() 判断不可访问的属性时
__unset() 销毁不可访问的属性时


17.重写和重载
重写/覆盖  override 子类重写父类同名的方法

重载(重写载入方法) overload 指存在多个同名的方法,但是方法的参数不同,调用不同方法
比如:龙生九子,虽然九个都是龙,但是他们方法不一样,用途也不一样
但是,PHP中是不允许多个同名方法存在,因此不能像java和c那样重载,也是因为php太灵活
可是,我们可以利用PHP的灵活性达到重载的效果


举个例子:
利用一个函数分别求长方形和圆形的面积?利用参数的不同实现方法重载
class Cal{
		public function area(){ //定义一个函数,我不知道要向函数传几个参数
			$args = func_get_args(); //该方法返回一个数组,数组中存放着方法的属性,比如传参数 10,15,20,就会返回数组10,15,20
		if (count($args) == 1) {
				return 3.14*$args[0]*$args[0];
			}else if (count($args) == 2) {
				return $args[0]*$args[1];
			}else{
				return '未知图形';
			}
		}
	}
	$calc = new Cal();
	echo $calc->area(10); //计算圆形面积
	echo $calc->area(10, 20); //计算长方形面积



18.魔术方法使用(搭建TP框架,通过__set()把属性方法数组中,传给 sql)
class Model{
		protected $data = array();


		public function __set($k, $v){
			$this->data[$k] = $v;
		}


		public function add(){
			$sql = 'insert into table (';
			$sql .= implode(',', array_keys($this->data));
			$sql .= ') values (\'';
			$sql .= implode(',', array_values($this->data));
			$sql .= '\')';
			return $sql; 
		}
	}
	$model = new Model();
	$model->username = 'lisi';
	$model->email = 'lisi@163.com';
	print_r($model);


19.类常量
  普通常量 define('PI', 3.14); //全局有效 
  类常量 const PI = 3.14; //类中的不可修改的静态属性,public权限,类外可以调用
  public static $pi = 3.14; 和类常量的作用是一样的


20.魔术常量   无法手动修改,值会随着环境的变化而变化
__FILE__   返回当前文件的路径,框架开发或者网站初始化时用来管理网站的根目录
__LINE__   返回当前的行号,框架中,用在dubug中,记录错误信息
__DIR__   返回当前文件的目录
__CLASS__  返回当前的类名
__METHOD__ 返回当前的方法名




21.抽象类/抽象方法 abstract
1.抽象类  抽象方法 名字前加 abstract
2.抽象类不能实例化(不能 new)  抽象方法不能有方法体(不能有{})
3.抽象类中不一定有抽象方法,但是有抽象方法的一定是抽象类
4.抽象类的作用是作为接口,实现多态。 所以面向对象的一个特点就是可拔插性


22.接口 interface     实现接口 implements
1.接口就是指定某个类可以实现某种功能,(猴子-跳, 鸟-飞, 狗-吃...)
一个类实现多个接口,完成多种功能(人这个类实现多个接口,可以跳, 飞, 吃...,最后new出一个小明,实现可以吃的功能)
2.接口本身就是抽象的,内部方法也是抽象的,不需要加abstract,而且方法不可以加{}
3.一个类可以实现多个接口,implements
4.接口可以继承  interface monkey extends animal;
5.接口是一堆方法,不可以属性,就当做功能的说明书,不可以有零件
6.接口必须是 public,是连通外界的出口
6.接口可以 extends 接口,但是接口不可以 implements 接口,只有类可以 implements 接口。
7.接口是连接前端和后端开发者的桥梁 


23.类的自动加载
类的加载是通过 include 和 require 来加载的
require("MyRequireFile.php"); 放在程序最前面,PHP程序执行前会先导入require,成为PHP页面的一部分。常用的函数也可以用该方法导入。
 如果存在错误,程序终止,显示致命错误
include("MyIncludeFile.php"); 放在程序流程控制的处理部分中,程序读到include时才会读进去,可以把程序流程简单化
 如果存在错误,程序不会终止,显示警告错误
require_once / include_once  只加载一次




//网上找到的,感觉不太会用,没有商城好理解
include 有返回值,通常情况下,包含成功返回1,失败返回0
 但是,如果被包含的文件用return返回的话,那么return的值就是文件中的值
可以用 return include 'config.php'; 来方便的使用配置文件
<?php	
	//config.php
	return array(
	'db'=>array(
		'host'=>'localhost',
		'user'=>'root',
		'password'=>'123456',
		'name'=>'test',
		'encoding'=>'utf8';
		)
	);


调用的时候直接$conf = include 'config.php'; 就可以了



自动加载 _autoload() 尝试加载未定义的类
如果调用一个不存在的类的时候,系统报错之前还会传给__autoload(),来确认下
我们也可以自定义一个自动加载类,使用函数 spl_autoload_register('自定义函数名');
	spl_autoload_register('myautoload');
		class Human{
			echo 'nihao';
		}
		function muautoload($c){
			echo 'you want to use '.$c;
		}
		$lisi = new People(); //由于没有People这个类,就会调用myautoload($c)方法。
	

商城中 的自动加载
	function __autoload($class) {
			if(strtolower(substr($class,-5)) == 'model') {
				//echo ROOT .'Model/'. $class . '.class.php';当问题出现的时候调试使用的
				require(ROOT .'Model/'. $class . '.class.php'); 
			}else if (strtolower(substr($class, -4)) == 'tool') {
				require(ROOT .'tool/'. $class . '.class.php');
			}else{
				require(ROOT .'include/'. $class . '.class.php');
			}
		}

24. @ 错误抑制报告符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值