① PHP 面向对象高级特性

② 11 种 PHP 设计模式

③ PSR-0,Composer,Phar 等最流行的技术

目标是掌握 PHP 各类设计模式,以及具备设计纯面向对象框架和系统的能力

【命名空间】

早期 php 没有命名空间的概念,所有的代码可以被认为是在同一个命名空间内运行,因此不能出现名称相同的类或函数:

代码 a ---- 类 a

代码 b ---- 类 b

代码 c ---- 函数 d

代码 d --- 函数 d

以上都是不允许的情况。

php 5.3 增加了命名空间的概念。

例:加入一个项目下有 3 个文件:

test1.php:

<?php
function test(){echo __FILE__;
}

test2.php:

<?php
function test(){echo __FILE__;
}

test.php:

<?php
require 'test1.php';
require 'test2.php';

运行 test.php,报错:Fatal error: Cannot redeclare test() (previously declared in D:\practise\php\design\test1.php:4) in D:\practise\php\design\test2.php on line (函数重命名导致致命错误)

当 test1.php 改为:

<?php
namespace Test1;function test(){echo __FILE__;
}

test2.php 改为:

<?php
namespace Test2;function test(){echo __FILE__;
}

运行 test.php ,不会报错。

【引用命名空间中的方法】

命名空间名称\方法名

如:

test.php

<?php
require 'Test1.php';
require 'Test2.php';Test1\test();

页面输出:D:\practise\php\design\Test1.php

【类的自动载入】

当项目越来越大时,文件越来越多,如果一个文件要依赖几十个php 类,那么就要在该文件的代码之前写几十行的 require 语句,开发和管理起来非常不便。在php 5.2 之后的版本提供了类的自动载入功能。早起 php 使用 __autoload() 方法。

例如,一个项目中有 3 个文件

Test1.php:

<?php
class Test1{static function test(){echo __METHOD__;}
}

Test2.php:

<?php
class Test2{static function test(){echo __METHOD__;}
}

test.php:

<?php
Test1::test();
Test2::test();function __autoload($class){require __DIR__.'/'.$class.'.php';
}

运行 test.php,页面输出:

Test1::testTest2::test

后来__autoload() 方法被废弃了,原因是一个 php 工程可能会依赖于多个框架,如果每一个框架都有这个函数,就会报函数重复定义的致命错误。在php 5.3 版本之后,官方提供了spl_autoload_register(); 方法取代 __aotoload() 方法。

spl_autoload_register() 的特点是允许存在多个 spl_autoload_register() 方法。

修改 test.php:

<?php
spl_autoload_register('autoload1');Test1::test();
Test2::test();function autoload1($class){require __DIR__.'/'.$class.'.php';
}

页面输出结果不变。

此时如果多个框架都有自己的类自动载入,只需要调用多次 spl_autoload_register() 即可,每个类都会分别完成自己的类自动载入,而且不会冲突:

<?php
spl_autoload_register('autoload1');
spl_autoload_register('autoload2');Test1::test();
Test2::test();function autoload1($class){require __DIR__.'/'.$class.'.php';
}function autoload2($class){require __DIR__.'/'.$class.'.php';
}

页面输出结果不变。

【开发工具】:PHPStorm

【编程字体】:使用等宽字体(常见的有Courier View,Consolas),推荐使用Source Code Pro(Adobe 公司专为程序员设计,免费开源)

【运行环境】:EasyPHP,集成了Apache,MySQL,PHPMyAdmin

转载于:https://www.cnblogs.com/dee0912/p/4396988.html

PHP 设计模式 笔记与总结(1)命名空间 与 类的自动载入相关推荐

  1. 设计模式笔记——代理模式

    设计模式笔记--代理模式 代理模式介绍 代理模式通常是介于请求方和提供方的一个中介系统,请求方是发送请求的一方,提供方是根据请求提供相应资源的一方 Web中的代理服务器就是一个例子,客户端向代理服务器 ...

  2. 【笔记】设计模式 | 5种设计模式笔记整理

    跟着b站的设计模式教程学的,以下是目前学习了的5种设计模式的笔记整理 设计模式简介 软件设计的现状:由于客户需求等原因需要频繁的变更软件内部的代码.所以能否设计出复用性尽可能高的程序以解决软件设计的复 ...

  3. Java设计模式笔记——七个结构型模式

    系列文章目录 第一章 Java设计模式笔记--七大设计原则 第二章 Java设计模式笔记--六个创建型模式 文章目录 系列文章目录 一.适配器模式 1.概念 2.类适配器 3.对象适配 4.缺省适配器 ...

  4. C++ 学习笔记(3)命名空间using、字符串、string、vector、迭代器、数组

    C++ 学习笔记(3)命名空间using.字符串.string.vector.迭代器.数组 参考书籍:<C++ Primer 5th> 3.1 命名空间的using声明 头文件不应该包含u ...

  5. 软件设计师——设计模式笔记上

    软件设计师--设计模式笔记上(创造型5种) 设计模式的主要目的 设计模式的原则 1.工厂方法模式(类模式) 意图 适用性 代码实现 2.抽象工厂模式(对象模式) 意图 适用性 代码实现 3.生成器模式 ...

  6. 设计模式笔记 18. Observer 观察者模式(行为型模式)

    18. Observer 观察者模式                     2008-09-15 动机(Motivation) 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系& ...

  7. 设计模式笔记零:设计模式简介

    原文:http://www.runoob.com/design-pattern/design-pattern-intro.html 少许个人理解,如有错误请指出 设计模式简介 设计模式:设计模式是软件 ...

  8. 大话PHP设计模式:类自动载入、PSR-0规范、链式操作、11种面向对象设计模式实现和使用、OOP的基本原则和自动加载配置...

    一.类自动载入 SPL函数 (standard php librarys) 类自动载入,尽管 __autoload() 函数也能自动加载类和接口,但更建议使用 spl_autoload_registe ...

  9. 【贪玩巴斯】Unity初学圣经Part2-C#基础——Day 01:C#基础之——命名空间、类、方法、变量的声明赋值和相关知识以及.NETC#关系讲解 2022年3月28日

    C#基础之--命名空间.类.方法.变量的声明赋值和相关知识以及.NETC#关系讲解 对应视频4-1至4-7 1.引入命名空间: 2.引入类.方法 3.变量的声明赋值 4.综合小练习 5. .NET的介 ...

最新文章

  1. php查询mysql放到数组中_php查询mysql数据库并将结果保存到数组的方法
  2. 机器推理文本+视觉,跨模态预训练新进展
  3. 【深度学习】基于Pytorch的softmax回归问题辨析和应用(二)
  4. CF#1288A Deadline (函数求最值问题)
  5. python 继承的规则
  6. Android之可以做的两件坏事---破解锁屏密码和获取Wifi密码
  7. 百度的html代码是什么,百度网页源代码是什么?
  8. thinkphp v5.0.11漏洞_thinkphp 5.0 代码执行漏洞
  9. android应用开发---(第1章)android基础学习之六大Layout布局
  10. Android 快速实现微信支付(真的!很快!)
  11. IDEA的Database表的基本操作
  12. 【渝粤题库】陕西师范大学200061语言学概论作业(高起本、专升本)
  13. 百度网盘链接在线解析网站_最近很热闹啊,免登陆百度网盘高速链接转换工具...
  14. 网易云邮箱验证码注册及修改密码
  15. Matches UVA - 11375 递推+大数 Ingenuous Cubrency UVA - 11137 递推
  16. django crontab UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfe in position 9: invalid start
  17. go的取模运算小tips
  18. 风险回避、减轻、转移、接受,汇率风险
  19. php展厅控制系统,展厅中控系统
  20. 一行代码实现curry化

热门文章

  1. 【Qt】Qt中QJsonDocument 类
  2. 【Linux】一步一步学Linux——Linux特殊权限位详解(114)
  3. 【物联网】 ESP8266 Ubuntu开发环境的搭建
  4. python日历函数_python 怎么定义一个函数,输出日历
  5. netbeans html 格式化,在NetBeans IDE8.0中怎么把html的文件转换成jsp格式
  6. Openstack dnsmasq配置域名解析
  7. 记录 之 tensorflow 常用函数:tf.split(),tf.clip_by_value() 和 tf.cond()
  8. Python将文字转拼音
  9. 频域补零上采样_AURIX 学习笔记(12)频域法互相关实现超声测距
  10. react封装函数_GitHub - daifee/react-component: 用 React 封装一套常用组件