【composer】
包管理工具,解决依赖、版本的问题、解决版本的升级问题
它就像迅雷一样
npm     node package manager
<?php
include "vendor/autoload.php";
use \NoahBuscher\Macaw\Macaw;
Macaw::get('/', function() {
echo 'Hello world!';
});
Macaw::get('/love',function(){
echo '我最近好想小亮啊';
});
Macaw::get('/userinfo' , 'UserController@info');
Macaw::get('/aa' , 'UserController@add');
Macaw::dispatch();
【下载】
http://docs.phpcomposer.com/00-intro.html
1、需要安装composer
2、安装之前你需要在php.ini里面extension=php_openssl.dll打开
3、下载安装
安装到你的php.exe路径
4、检测是否安装成功
【json数据格式】
 {
    "键1":"值1",
    "键2":"值2",
    "键3":"值3",
    "键1":[
        "键1":"值1",
        "键2":"值2",
        "键3":[]
    ]
}
composer在执行的时候需要一个配置文件composer.json
【dos常用命令】
cd enter diectory 进入目录
dir 常看当前文件夹下面的所有的东西
cd .. 返回上一级目录
【composer常用的命令】
clear-cache
【版本号】
"name":"likun",
"description":"",
"keywrods":" , , ",
"lincence":"当前软件对应的协议"
【异常抛出】
try{
} catch (Exception $error) {
}
$error -> getMessage() //获取错误信息
getLine() //获取错误行
getFile() //获取错误的文件
getCode() //获取错误号--可以手动指定
可以自定义异常抛出类,继承Execption
使用自定义异常抛出类时需要注意:放在系统的基类Execption之前
<?php
//手动自定义一个异常抛出
class MyExecption extends Exception
{
    public function myGetCode()
    {
        echo $this->getLine().'<br />';
        echo $this->getMessage().'<br />';
        echo $this->getCode().'<br />';
    }
}
try {
    $fp = fopen('a.txt' , 'r');
    if (!$fp) {
        throw new MyExecption('文件打开失败' , 100);
    }
}catch (MyExecption $e) {
    echo $e->myGetCode();
} catch (Exception $e) {
    echo $e->getFile().'<br />';
}
try catch 可以嵌套try catch
【异常抛出】
set_exception_handler
<?php
set_exception_handler('myExecption');
function myExecption($e)
{
echo '快到碗里来<br />';
echo $e->getMessage();
echo $e->getCode();
}
throw new Exception('你看我走到哪里了', 110);
【虚拟主机配置】
第一步
先打开C:\Windows\System32\drivers\etc
hosts 文件
第二步
C:\wamp64\bin\apache\apache2.4.17\conf---httpd.conf
#Include conf/extra/httpd-vhosts.conf 注释打开
LoadModule rewrite_module modules/mod_rewrite.so 注释打开
第三步 注意 配置的时候切记备份一份
C:\wamp64\bin\apache\apache2.4.17\conf\extra --- httpd-vhosts.conf
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host2.example.com
//你的联系方式
DocumentRoot "c:/Apache24/docs/dummy-host2.example.com"
项目的根目录
ServerName dummy-host2.example.com
域名
ErrorLog "logs/dummy-host2.example.com-error.log"
错误日志
CustomLog "logs/dummy-host2.example.com-access.log" common
自定义的日志
</VirtualHost>
第四步
找到你的hosts文件 把域名给你配置的写一致 重复服务
【设计模式】
    1、单例设计模式
<?php
//单例设计模式
//只实例化一次,始终都是一个对象
class Single
{
public static $instance;
private function __construct()
{
$link = mysqli_connect('localhost' , 'root' , 'kungezuishuai');
return $link;
}   
public static function getInstance()
{
if (isset(self::$instance)) {
return self::$instance;
} else {
return self::$instance = new self();
}
}   
}
$obj1 = Single::getInstance();
$obj2 = Single::getInstance();
if ($obj1 === $obj2) {
echo '是同一个对象';
} else {
echo '不是同一个对象';
}
    2、工厂设计模式
        1)普通工厂
<?php
//普通工厂
class Fly
{
public function create()
{
echo '飞机被造出来了';
}
}
class daPao
{
public function create()
{
echo '大炮被造出来了';
}
}
class Factory
{
public static function create($type)
{
return new $type();
}
}
$factroy = Factory::create('daPao');
$factroy ->create();
        2)标准工厂
<?php
//标准工厂
interface Wuqi
{
public function create();
}
class Fly implements Wuqi
{
public function create()
{
echo '飞机被造出来了<br />';
}
}
class daPao implements Wuqi
{
public function create()
{
echo '大炮被造出来了<br />';
}
}
class WuqiFactory
{
public $obj;
public function __construct($type)
{
$this->obj = new $type();// new Fly();
}
public function make()
{
return $this->obj;
}
}
$factory = new WuqiFactory('Fly');
$fly = $factory->make();
$fly->create();
        3)工厂方法  
<?php
//工厂方法
//把工厂给接口化
interface Wuqi
{
public function create();
}
class Fly implements Wuqi
{
public function create()
{
echo '制造飞机';
}
}
class daPao implements Wuqi
{
public function create()
{
echo '制造大炮';
}
}
interface Factory
{
public function make();
}
class FlyFactory implements Factory
{
public function make()
{
return new Fly();
}
}
class daPaoFacgory implements Factory
{
public function make()
{
return new daPao();
}
}
$factory = new FlyFactory();
$fly = $factory->make();
$fly->create();
        4)抽象工厂
<?php
//抽象工厂
//就是把工厂更细化
interface Wuqi
{
public function create();
}
class BigFly implements Wuqi
{
public function create()
{
echo 'this is bigFly';
}   
}
class SmallFly implements Wuqi
{
public function create()
{
echo 'this is SmallFly';
}
}
interface Factory
{
public function FlyBig();
public function FlySmall();
}
class FlyFactory implements Factory
{
public function FlyBig()
{
return new BigFly();
}
public function FlySmall()
{
return new SmallFly();
}
}
$factory = new FlyFactory();
$fly = $factory->FlySmall();
$fly->create();
    3、观察者
//观察者 被观察者 消息(反应)
interface Observales
{
//添加观察者
public function attach($observer);
//移出被观察者
public function detach($observer);
//消息
public function notify();
}
class Boss implements Observales
{
//实现添加被观察者
public $observales = [];
//定义一个价格
public $price = 10;
//添加观察者
public function attach($observer)
{
if (!in_array($observer , $this->observales)) {
$this->observales[] = $observer;
}
}
//移出被观察者
public function detach($observer)
{
foreach ($this->observales as $key => $val) {
if ($val == $observer) {
unset($this->observales[$key]);
}
}
}
//消息
public function notify()
{
foreach ($this->observales as $observer) {
$observer->do($this);
}
}
//改变价格
public function changePrice($price)
{
$this->price = $price;
$this->notify();
}
}
//观察者接口
interface Observer
{
public function do($observales);
}
//穷人的反应
class Poor implements Observer
{
public function do($observales)
{
if ($observales->price > 20) {
echo '穷人说太贵了吃不起<br />';
} else {
echo '穷人说太便宜了不吃了<br />';
}
}
}
//富人的反应
class Rich implements Observer
{
public function do($observales)
{
if ($observales->price > 20) {
echo '富人说太便宜了吃不起<br />';
} else {
echo '富人说太便宜了不想吃<br />';
}
}
}
$boss = new Boss();
$rich = new Rich();
$boss->attach($rich);
$boss->changePrice(30);
    4、mvc
    5、适配器
<?php
//适配器
//解决类似功能,使用方法不一致的时候
//数据库 mysql Sqllite oracle
class MysqlDb
{
public function connect()
{
echo 'mysql数据库链接方法<br />';
}
public function select()
{
echo 'mysql数据库查询方法<br />';
}
}
//sqllite 数据库
class SqlLite
{
public function find()
{
echo '这是sqllite查询一条数据<br />';
}
}
//这是oracle的
class Oracle
{
public function init()
{
echo '这是oracle的初始化方法';
}
public function connect()
{
echo '这是oracle的数据库链接';
}
public function pre()
{
echo '这是oracle的预处理方法';
}
public function select()
{
echo '这是oracle的查询方法<br />';
}
}
interface Db
{
public function select();
public function connect();
}
class MysqlAdpter extends MysqlDb implements Db
{
public function connect()
{
parent::connect();
}
public function select()
{
parent::select();
}
}
class SqlLiteAdpter extends SqlLite implements Db
{
public function connect()
{
}
public function select()
{
parent::find();
}
}
class OracleAdpter extends Oracle implements Db
{
public function connect()
{
parent::init();
parent::connect();
}
public function select()
{
parent::pre();
parent::select();
}
}
define('DB_TYPE' , 'Mysql');
$db_type = DB_TYPE.'Adpter';
$db = new $db_type();
$db->select();
    6、门面设计模式
<?php
//门面设计模式
//定义一个静态方法来完成一些调用复杂的功能
class Duck
{
public function kill()
{
echo '第一步傻鸭子<br />';
}
public function bamao()
{
echo '第二步拔毛<br />';
}
public function xiaguo()
{
echo '第三步下锅<br />';
}
}
class FacadeDuck
{
public static function make()
{
$duck = new Duck();
$duck->kill();
$duck->bamao();
$duck->xiaguo();
}
}
FacadeDuck::make();
    7、策略设计模式
<?php
//策略设计模式
//你要实现什么功能,通过什么方式去实现
class Travel
{
public $tool; //fly  对象
public function __construct($tool)  //fly
{
$this->tool = $tool;
}
public function arrive()
{
echo '我要'.$this->tool->go().'去天竺';
}
}
interface Tool
{
public function go();
}
class Fly implements Tool
{
public function go()
{
return '开着飞机去';
}
}
class Bike implements Tool
{
public function go()
{
return '骑着自行车去';
}
}
$travel = new Travel(new Fly);
$travel->arrive();
    8、di 依赖注入 (翻转控制)
<?php
//di 依赖注入 翻转控制
//就是你实现什么功能 到时候需要用到其他的方法,把一个对象传进来
class Son
{
public function cry(Father $father)
{
echo '哇哇哇哇!!!!';
$father->baobao();
}
}
class Father
{
public function baobao()
{
echo '爸爸抱抱,乖别哭了<br />';
}
}
class Mother
{
public function baobao()
{
echo '妈妈抱抱,别哭了';
}
}
$baby = new Son();
$baba = new Father();
$baby->cry($baba);
    9、容器
<?php
//容器
//利用静态的类,来实现创建对象
class Container
{
public static $register = [];
//person
public static function bind($name , closure $closure) //function(){return new Person();}
{
if (!isset(self::$register[$name])) {
self::$register[$name] = $closure;
}
}
public static function make($name)  // person
{
$func = self::$register[$name]; //就是匿名函数 //function(){return new Person();}
return $func(); //function(){return new Person();}
}
}
class Person
{
public function say()
{
echo '我说话了<br />';
}
}
Container::bind('person' , function(){
return new Person();
});
$obj = Container::make('person');
$obj->say();
1、常见设计模式:
单例、工厂、MVC、观察者、
门面、容器、策略、工厂方法、
抽象工厂、适配器、依赖注入
2、依赖注入:
DI,也叫反转控制(IOC)
3、容器:
是一种思维,是一种技术
4、反射:
根据类的名字能够知道这个类的所有信息
ReflectionClass:类报告了一个类的有关信息。
ReflectionMethod:类报告了一个方法的有关信息。
ReflectionParameter:取回了函数或方法参数的相关信息。
<?php
class Father
{
public function hug()
{
echo '来,老爸抱一下<br />';
}
}
class Mother
{
public function nurse()
{
echo '赶紧喂奶';
}
}
class Baby
{
public function cry(Father $father)
{
echo '宝宝哇哇大哭<br />';
$father->hug();
}
public function hungury(Mother $mother, $c = 3)
{
echo '宝宝饿了,哇哇哭了'.$c.'声<br />';
$mother->nurse();
}
}
//将依赖关系的控制,反转到调用链的起点,因此也叫反转控制
//当出现大量依赖对象的时候,创建一个对象将变得异常复杂
//因此可以通过容器技术,将对象的创建方法保存起来
//容器
class Container
{
//用来保存所有创建对象的方式(闭包/函数)
protected static $objects = [];
//绑定对象的创建方法
public static function bind($key, $closure)
{
self::$objects[$key] = $closure;
}
//根据指定的名称获取对象
public static function make($key)
{
//如果已经绑定了创建方法
if (array_key_exists($key, self::$objects)) {
$closure = self::$objects[$key];
return $closure();
}
//如果没有绑定,通过反射技术创建对象
$ref = new ReflectionClass($key);
//判断能否内实例化
if (!$ref->isInstantiable()) {
exit('此类不能被实例化');
}
//获取构造方法
$construct = $ref->getConstructor();
if (is_null($construct)) {
return $ref->newInstanceArgs();
}
//若有构造方法,根据构造方法创建对象
//获取构造方法的参数
$parameters = $construct->getParameters();
//封装函数,创建构造函数中依赖所有参数
$dependencies = self::dependencies($parameters);
return $ref->newInstanceArgs($dependencies);
}
protected static function dependencies($parameters)
{
//用来保存所有的参数
$dependencies = [];
foreach ($parameters as $parameter) {
if ($class = $parameter->getClass()) {
//是对象,递归创建
$dependencies[] = self::make($class->name);
} else {
//不是对象
//是否有默认值
if ($parameter->isDefaultValueAvailable()) {
//有默认值
$dependencies[] = $parameter->getDefaultValue();
} else {
//没有默认值
exit('what should I do ??');
}
}
}
return $dependencies;
}
public static function route($c, $a)
{
$controller = self::make($c);
//创建反射方法的对象
$refMethod = new ReflectionMethod($c, $a);
//判断是否能够使公有方法
if (!$refMethod->isPublic()) {
exit('不能调用非公有方法');
}
//获取所有参数
$parameters = $refMethod->getParameters();
//创建所有的依赖
$dependencies = self::dependencies($parameters);
call_user_func_array([$controller, $a], $dependencies);
}
}
/*
//需要提前将对象的依赖关系保存在容器中
Container::bind('Father',function(){
return new Father();
});
Container::bind('Baby',function(){
return new Baby(Container::make('Father'));
});
$baby = Container::make('Baby');
$baby->cry();
*/
$c = $_GET['c'];
$a = $_GET['a'];
Container::route($c,$a);

PHP3 设计模式、COMPOSER、异常处理相关推荐

  1. 腾讯大佬用了12小时讲完的Python,整整400集,拿走不谢!

    Python在近几年越来越受追捧,很多童鞋或者职场小伙伴想要提升技能-学习Python. 这是非常好的事情,但问题在于很多人不知道学Python做什么,所以什么零碎细末.艰难晦涩.长篇大论的都去看,很 ...

  2. python从安装开始加粉_清华教授用了12小时讲完的Python,整整400集,拿走不谢!...

    Python在近几年越来越受追捧,很多童鞋或者职场小伙伴想要提升技能-学习Python. 这是非常好的事情,但问题在于很多人不知道学Python做什么,所以什么零碎细末.艰难晦涩.长篇大论的都去看,很 ...

  3. python算法书pdf_Python算法很难吗?python神书《算法图解》PDF电子版分享给你!

    许多小伙伴后台私信柠檬说,python算法让自己很头疼,有没有可以让算法像小说一样有趣的书籍资料呢?看这里吧!柠檬为大家找到了这本<算法图解>的PDF电子版!让你在学习python的路上变 ...

  4. python人生的不同阶段_从入门到入土的Python自学教程,用改变你的人生轨迹

    Python在近几年越来越受追捧,很多童鞋或者职场小伙伴想要提升技能-学习Python. 这是非常好的事情,但问题在于很多人不知道学Python做什么,所以什么零碎细末.艰难晦涩.长篇大论的都去看,很 ...

  5. python学哪个版本-我现在应该学习哪个版本的Python?哪个方向更好?

    Python是一种非常高级的编程语言. 该语言适合基于初学者的学习. 这也是初学者的首选. 现在无论是从事人工智能还是爬行动物Python,它都具有非常重要的作用,并且现在已经成为非常重要的编程. 语 ...

  6. python免费入门教程-python小白如何入门,第一步要做什么?(附带免费教程)

    Python小白一枚,不知道如何入门,上网整理了一些点,简单记录一下,希望对接下来的学习有帮助吧. 1.找到合适的入门书籍,大致读一次,搞懂(太难的跳过). 2.做些简单习题,字符串比较,读取日期之类 ...

  7. python 合并 循环list_阿里巴巴鼎力推荐,Python入门至精通,24招加速你的Python

    对于Python初学者想更轻松的学好Python开发,Python爬虫技术,Python数据分析,人工智能等技术,这里也给大家准备了一套Python系统教学资源,下面介绍下阿里巴巴推荐的大型Pytho ...

  8. 中呜机器人编程视频教程_清华北大泄露Python436集视频教程,这就是你现在需要的...

    Python是世界上功能最多,功能最强大的编程语言之一.通过Python,可以编写自己的应用程序,创建游戏,设计算法,甚至编程机器人.而且Python的热度现在一直高居不下,比如,完成同一个任务,C语 ...

  9. python 宏处理库_常用的Python库,给大家分享一下!

    Tkinter---- Python默认的图形界面接口. Tkinter是一个和Tk接口的Python模块,Tkinter库提供了对Tk API的接口,它属于Tcl/Tk的GUI工具组.Tcl/Tk是 ...

最新文章

  1. 实验1 命令解释程序的编写
  2. python多维字符数组_python多维数组内找指定字符串
  3. SAP PP 启用了MRP Area之后MMBE有什么变化?
  4. TCP/IP 协议标准简单描述
  5. 研究Xposed相关二:如何root android模拟器(android4.3.1)
  6. 生产者消费者_【线程通信】生产者消费者模型
  7. java jwt 验证_教程:用Java创建和验证JWT
  8. 为什么要用Redis?
  9. myeclipse 上安装 Maven3
  10. 准备结婚,大家买的三金都有哪些?
  11. 微型linux系统裁剪
  12. 大三狗重新复习算法之递推
  13. iPhone6分辨率
  14. 酷q服务器未响应,酷Q [CQHTTP Python Async SDK] 入坑指南【已失效】
  15. Delphi基础教程图文版之开篇
  16. linux中磁盘阵列说明,常用磁盘阵列说明
  17. 沧海云帆服务器哪里的,11月沧海云帆大区天涯合璧-数据互通(合服)服务器维护公告(已完成)...
  18. 中国出海50强,华为超越阿里得亚军,第一名居然是它?
  19. 300 秒就完成第一超算 1 万年的计算量,量子霸权真时代要来了吗
  20. 复旦教授报告400多个安卓漏洞,历时16个月谷歌终于修复,此前曾立flag

热门文章

  1. unity集成android原生录音(可后台)并实现上传
  2. 西门子免授权数控机床采集方案
  3. QMS-云质-质量管理软件-供应链质量管理
  4. 基于PyHusky的分布式爬虫原理及实现
  5. 华强北众多三代版本如何选购?
  6. usb摄像头方案厂商
  7. mastercam 马扎克 mazake8800 卧式加工中心后处理器
  8. 如何搭建一个FMS的视频流媒体服务器用于监控直播?
  9. Android Camera 打开预览流程分析(一)--打开camera的SDK流程
  10. 用docker-compose构建mysql主从结构