1、语言发展
-
机器语言 组成:0,1组成的命令 优点:执行效率高 缺点:开发难度大、移植性差、开发成本高 -
汇编语言 组成:简洁的英文字母和符号 优点:指令简单明了、推广性高 缺点:移植性差、功能简单 -
高级计算机语言 组成:类似自然语言的符号,系统对程序代码进行编译执 ? 行,高级语言编程思想分为 面向过程 和面向对象 优点:移植性强、可读性强、推广性非常高 缺点:执行效率低 ?
2、编程思想
? 拆分封装函数实现代码复用,节省开发升本。按照既定方式执行到底,不够灵活
- 面向对象编程(Object Oriented Programming)
? 建立在面向过程基础上,面向对象解决的本质是主体谁 来实现操作,任何动作的执行均属于对象
?
3、面向对象基础
面向对象中,关键结构包含以下几类
-
类 class -
对象 object -
实例化 new -
类成员 member
-
方法 method -
属性 property -
类成员 constant
4、常见盲点
- 对象传递是传引用,共用内存地址
- 范围解析操作符 ‘
:: ’ 访问类常量 如 cls::PI - 静态属性不属于类普通属性,无法通过
cls->$name 方式获取,无需通过实例化对象访问 public 修饰方法不建议通过“cls::name ”调用,虽然可运行,不一定报错,但不建议static 修饰方法可以通过普通方式调用"cls->$name " 但不推荐,且内部不允许使用$this ,可以用self 替代类__autoload() 在 php <7.0之前为自动加载文件机制,php7 以后推荐函数+sp_autoload_register() 方式实现注册加载文件- 克隆出来的对象为不同对象,被克隆出来的对象会调用
__clone() 方法,将__clone() 方法私有化则禁止克隆 - 子类继承父类公有成员(含常量)、受保护成员及私有属性,但不继承私有方法
- 子类重写父类会覆盖父类相应方法或属性
public 、protected 属性均可重写覆盖 ,子类继承父类的控制权限不能大于父类,如 父类private 子类可改为private/protected/public 中任一 PHP7 中要求被重写方法必须与父类参数保持一致foreach 可以遍历对象,但访问的是公有属性
5、单例模式
单例模式目的是保护资源的唯一性,单例模式设计规范“三私一公” 【私有构造化方法、私有克隆方法、私有静态属性、公有静态方法】
class Singleton
{
private static $instance;
private function __construct(){}
private function __clone(){}
public static function getInstance()
{
if (!self::$instance instanceof self) {
self::$instance = new self();
}
return self::$instance;
}
public function test()
{
echo "我是一个单例模式";
}
}
6、工厂模式
<?php
class Man {}
class Woman {}
class Factory
{
public function getInstance($clsName){
return new $clsName();
}
}
class StaticFactory
{
public static function getInstance($clsName){
return new $clsName();
}
}
class Factory3
{
public static function getInstance($flag){
switch ($flag) {
case 'm':
$clsName = 'Man';
break;
default:
$clsName = 'Woman';
break;
}
return new $clsName();
}
}
$fac = new Factory();
$m = $fac->getInstance('Man');
$n = $fac->getInstance('Woman');
$m = StaticFactory::getInstance('Man');
$n = StaticFactory::getInstance('Woman');
$m = Factory3::getInstance('m');
$n = Factory3::getInstance('n');
?>
7、面向对象三大特性
- 封装
- 继承
- 多态
- 多态必须有继承关系,并且子类重写父类方法
- 多态是指父类对象拥有子类形态,并可以表现子类特性
- php是弱语言,不支持多态
8、静态延迟绑定
静态延迟绑定【关键字 static】对比的是self 方式,子类访问才生效
<?php
class Human {
public static $name = "humam";
public static function getName(){
echo self::$name.'<br/>';
echo static::$name.'<br/>';
}
}
class Man extends Human {
public static $name = "Man";
}
Man::getName();
执行结果
$> php scratch.php
humam<br/>
Man<br/>
9、final 修饰类或方法
final 修饰的类或者方法都不能被重写或继承
<?php
final class Human {}
子类来继承用final修饰的类会报错
10、abstract 修饰类或者方法
抽象类不能被实例化,只能被继承;
抽象方法在继承时必须实现该抽象方法;
抽象类目的是用于规范子类
<?php
abstract class Human {
abstract public function test (){}
}
class Man extneds Human {
public function test (){
echo "this is test";
}
}
11、interface 接口类
接口主要用于规范子类,且接口不能被实例化;
接口成员只能包含空方法和常量成员,允许抽象方法存在
抽象类也可以实现接口,接口可以多继承
<?php
interface Human {
const NAME = "人"
public function walk();
}
interface Animal {
public function eat();
}
interface Man extends Human {}
interface Dog extends Human, Animal {}
[abstract] class Woman implements Human {
public function walk(){
echo '走';
}
}
12、trait 代码复用
trait 定义一些共用的方法, 不能被实例化,不能有常量,在类中通过use 方式引用,类中可以多个引用trait ;类属性不允许与trait中重名,类方法与trait重名会覆盖;同名时优先级 :自身类> trait > 父类; trait 可以使用抽象方法
<?php
trait Traits {
public $name;
protected $age;
private $money;
public static function test(){
echo 'trait test';
}
}
trait Traits1 {
public static function test(){
echo 'trait test';
}
}
class Human {
use Traits, Traits1{
Traits::test insteadof Traits1;
Traits1::test as [public/protected/private] test1;
}
}
Human::test();
Human::test1();
13、重载overload(容错机制)
为了保护程序正确运行而提供的容错机制
常见容错机制使用的魔术方法
__get() /__set() 获取属性__isset() / __unset() 调用属性__call() 调用未定义方法__autoload 使用未被定义的类时调用__construct() 、__destruct() 创建和销毁__clone() 克隆__toString() 将对象转为字符串__sleep() /__wakeup 串行和反串行 结合serialize/unserialize检查使用__set_state 调用var_export()触发__callStatic 类似__call() 用于处理静态方法__invoke 尝试以调用函数方式调用对象时触发
|