PHP 设计模式之最全面,最简单的讲解

1.单例模式

单例模式是指只创建一个资源(对象、数据库链接等),防止外部实例+判断是否有返回或创建后返回对象。

三个要点:
1.需要一个保存类的唯一实例的静态成员变量
2.构造函数和克隆函数必须声明为私有的,防止外部程序new类从而失去单例模式的意义
3.必须提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一实例的一个引用
优点:

1.单例模式减少资源浪费,保证整个环境只有一个实例对象,特别适合编写资源连接类

代码:
#代码:
	class RedisServer
	{
	    #创建一个静态变量 保存类的唯一实例的静态成员变量
	    private static $instance=[];
	    private $redis;
	    private $host='127.0.0.1';#ip
	    private $post=6379;#端口号
	    private $timeout=0;#闲置时间后关闭
	    private $table=0;#指定哪个库
	    private $connect=1;# 1 长连接 0 短连接
	    //私有的构造方法,禁止外部使用new创建对象 走完这里 3再走方法
	    #指定 ip 端口 这两个是基本不会变的 但是 库的会变 所以根据库的不同 可以new 不同的对象
	    private function __construct($config){
	        $this->redis = new Redis();
	        if(isset($config['host']))  $this->host = $config['host'];
	        if(isset($config['post']))  $this->post = $config['post'];
	        if(isset($config['timeout']))  $this->timeout = $config['timeout'];
	        if(isset($config['table']))  $this->table = $config['table'];
	        if(isset($config['connect']))  $this->connect = $config['connect']>=1 ?1:0;
	
	        # 连接
	        if($this->connect){
	            $this->redis->pconnect($this->host,$this->post,$this->timeout);
	        }else{
	            $this->redis->connect($this->host,$this->post,$this->timeout);
	        }
	
	        if($this->table>15 || $this->table<0 || !is_int($this->table) ){
	            echo '数据库表只能填写0~15的整数';
	            exit;
	        }
	        #选择库
	        $this->redis->select($config['table']);
	    }
	    #1先走这里
	    public static function getInstance($config=[]){
	        $table = array_key_exists('table',$config) ?$config['table']:0;
	        #为啥这里的私有变量 需要加数组呢 如果不加的话 他已经存在了 但他指定的表可能不是你所需要的 就会存在bug
	        if(!isset(self::$instance[$table])){
	            # 这里创建一个对象 赋值给变量
	            echo '重新新建一个表为'.$table.'的对象!';
	            self::$instance[$table] = new self($config);//2然后再走 __construct
	        }
	
	        return self::$instance[$table];
	    }
	    //私有的克隆函数 将克隆方法设为私有,禁止外部克隆对象
	    private function __clone(){}
	    # 4 方法
	        
	        public function close(){
	            return $this->redis->close();
	        }
	        public function getString($str){
	           return $this->redis->get($str);
	        }
	        public function setString($key,$value){
	            return $this->redis->set($key,$value);
	        }
	
	}
	
	$config =[
	    'host'=>'127.0.0.1',#ip
	    'post'=>'6379',#端口号
	    'timeout'=>'0',#闲置时间后关闭
	    'table'=>1,#指定哪个库
	    'connect'=>0,# 1 长连接 0 短连接
	];
	$config1 =[
	    'host'=>'127.0.0.1',#ip
	    'post'=>'6379',#端口号
	    'timeout'=>'0',#闲置时间后关闭
	    'table'=>2,#指定哪个库
	    'connect'=>0,# 1 长连接 0 短连接
	];
	$Server = RedisServer::getInstance($config);
	$Server1 = RedisServer::getInstance($config1);

2.工厂模式

工厂模式其实是一种类,它具有创建对象的某些方法。我们可以使用工厂类来创建对象,而不直接使用 new。这样做的好处是,如果你想要更改所实例化的类名,则只需更改该工厂方法内容即可,不需要逐一寻找代码中具体实例化的地方来修改了。为系统结构提供灵活的动态扩展机制,减少了耦合。

优点:

帮助封装:简单工厂虽然简单,但是非常友好地帮助我们实现了组件的封装,然后让组件外部能真正面向接口编程。
解耦 :通过简单工厂,实现了客户端和具体实现类的解耦。

缺点:

可能增加客户端的复杂度。

工厂模式其实可以划分为:简单工厂模式、工厂方法模式、抽象工厂模式等。

1.简单工厂模式

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。一般用在具体产品很少扩展的情况下,不用经常修改,且不修改代码的话是不能实现扩展的。

例子:去商店卖手机 一个是苹果厂商提供的手机 一个是小米厂商提供的手机。

#简单工厂模式
	#定义一个接口 手机类商品 等电子产品
	interface Mobile
	{
	    #手机
	    public function mobile();
	    #充电器
	    public function charger();
	}

	#苹果手机厂商
	class Iphone_Mobile implements Mobile {
	    public function __construct()
	    {
	        echo '苹果旗舰店:';
	    }
	    public function mobile(){
	        echo '手机;';
	    }
	    public function charger(){
	        echo '充电器;';
	    }
	}
	#小米手机厂商
	class XiaoMI_Mobile implements Mobile {
	    public function __construct()
	    {
	        echo '小米旗舰店:';
	    }
	    public function mobile(){
	        echo '手机;';
	    }
	    public function charger(){
	        echo '充电器;';
	    }
	}
	# 商店
	class Shopping
	{
	    public static function create($class){
	        switch ($class)
	        {
	            case 'Iphone_Mobile':
	                return new Iphone_Mobile();#选择苹果厂商的商品
	                break;
	            case 'XiaoMI_Mobile':
	                return new XiaoMI_Mobile();#选择小米厂商的商品
	            default: echo '不好意思,我这里没有 '.$class.' 这个手机卖!';
	        }
	    }
	}
	#商店 下单买苹果手机
	$Iphone = Shopping::create('Iphone_Mobile');#苹果旗舰手机店:
	$Iphone->mobile();#买苹果手机:;
	$Iphone->charger();#买苹果充电器:;
	#商店 下单买小米手机
	$XiaoMI = Shopping::create('XiaoMI_Mobile');#小米旗舰店:
	$XiaoMI->mobile();#买小米手机:;
	$XiaoMI->charger();#买小米充电器:;
	#商店 下单买华为手机
	$HUAWEI = Shopping::create('HUAWEI_Mobile');#不好意思,我这里没有 HUAWEI_Mobile 这个手机卖!

2.工厂方法模式

例子:去店铺买手机。发现只有苹果的柜台和小米的柜台。而且柜台只有手机和充电器买。

通过定义了一个抽象出来的核心工厂类,并同时定义创建产品对象的接口,而创建具体实例的工作延迟到工厂子类中去完成


#工厂模式方法
	#定义一个接口 手机类商品 等电子产品
	interface Mobile
	{
	    #手机
	    public function mobile();
	    #充电器
	    public function charger();
	}

	#苹果手机厂商
	class Iphone_Mobile implements Mobile {
	    public function __construct()
	    {
	        echo '苹果手机:';
	    }
	    public function mobile(){
	        echo '手机;';
	    }
	    public function charger(){
	        echo '充电器;';
	    }
	}
	#小米手机厂商
	class XiaoMI_Mobile implements Mobile {
	    public function __construct()
	    {
	        echo '小米手机:';
	    }
	    public function mobile(){
	        echo '手机;';
	    }
	    public function charger(){
	        echo '充电器;';
	    }
	}
	
	#区别
		#定义一个抽象类
		#淘宝
		abstract class Taobao{
			abstract static function shop();# 开店 
		}
		
		# 苹果手机的厂家在淘宝开店
		class Iphone function extends Taobao{
			
			public static function shop(){
				return new Iphone_Mobile();#卖的是自己的苹果手机
			} 
		}
		
		# 小米手机的厂家在淘宝开店
		class XiaoMI function extends Taobao{
			
			public static function shop(){
				return new XiaoMI_Mobile();#卖的是自己的小米手机
			} 
		}
		 
		$one = Iphone::shop();#去苹果手机店里面
		$one->mobile();//手机
		$one->charger();//充电器
		
		$two = XiaoMI::shop();#去小米手机店里面
		$two->mobile();//手机
		$two->charger();//充电器
		
3.抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口。

例子:去淘宝买电子产品 只有两个电脑和手机两个种类的产品。 而且电脑产品只有:电脑和鼠标卖,手机产品只有:手机和充电器买。

#抽象工厂
 	#定义一个手机类电子产品的接口
	interface Mobile
	{
		#手机
	    public function mobile();
	 	#充电器
	    public function charger();
	}
 	# 苹果厂商
	class IPhone implements Mobile
	{
	    public function mobile()
	    {
	        echo "购买苹果手机";
	    }
	 
	    public function charger()
	    {
	        echo "购买苹果充电器";
	    }
	}
 	#定义一个电脑类电子产品的接口
	interface Computer
	{
		#电脑
	    public function computer();
	 	#鼠标
	    public function mouse();
	}
 	#小米厂商
	class XiaomiComputer implements Computer
	{
	    public function computer()
	    {
	        echo "购买小米电脑";
	    }
	 
	    public function mouse()
	    {
	        echo "购买小米鼠标";
	    }
	}
 	#定义一个抽象类的 店铺 里面提供手机产品和电脑产品
	abstract class Shop
	{
		#手机产品
	    abstract public static function createMobile();
	 	#电脑产品
	    abstract public static function createComputer();
	}
 	#淘宝
	class Taobao extends Shop{
		#手机产品
	    public static function createMobile()
	    {
	        return new IPhone();#只有苹果的手机产品买
	    }
	 	#电脑产品
	    public static function createComputer()
	    {
	        return new XiaomiComputer();#只有小米的电脑产品买
	    }
	}
 	#用户去淘宝选手机
	$one = Taobao::createMobile();#发现只有苹果的手机买
	$one->mobile();#买了一个苹果手机
	$one->charger();#买了一个苹果充电器
	
	#用户去淘宝选电脑
	$two = Taobao::createComputer();#发现只小米的电脑买
	$two->computer();#购买小米电脑
	$two->mouse()#购买小米鼠标
	

3.策略模式

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

代码示例:

#通过需要不同的日期信息来调用不同的类实现功能。
 #策略模式:
        #定义一个接口  日期转换
        interface Time
        {
            public function timeString();
        }

        # 当前的年份
        class Year implements Time{
            public function timeString(){
                   echo date('Y',time()).'年';
            }
        }
        # 当前的月份
        class Month implements Time{
            public function timeString(){
                echo date('m',time()).'月';
            }
        }
        # 当前的日期
        class Day implements Time{
            public function timeString(){
                echo date('Y-m-d',time());
            }
        }

        class Times {
            private $class;
            #根据所需的日期 来选择调用哪个类的方法
            public function timess(Time $class){
                 $this->class = $class;
                 return $this->class->timeString();
            }
        }

        $Year = new Times();
        #查看当前的年份
        $Year->timess(new Year());#2022年
        #查看当前的月份
        $Year->timess(new Month());#07月
        #查看当前的日期
        $Year->timess(new Day());#2022-07-20
        

4.适配器模式

将一个类的接口转成我们希望的另外一个接口,使得原本接口不兼容不能在一起工作的类可以在一起工作。

优点:灵活性和扩展性都非常好,符合开闭原则。
缺点:过多地使用适配器,会让系统非常零乱,不易整体进行把握。

代码示例:

#例如:封装一个缓存类,它支持  redis 和 memcache,只需切换使用时只需修改相关配置就能实现切换了,而不需要修改大量的代码。
#减少代码间的耦合,可以方便增减需要实现的类。
# 适配器模式
        #定义一个缓存类
        interface Cache
        {
            public function connect();
            public function set($key,$value,$time=0);
            public function get($key);
            public function del($key);
            public function close();
        }
		# 使用 redis 做为缓存
        class Rediss implements Cache
        {
            private $redis;

            public function __construct()
            {
                $this->connect();
            }
            public function connect()
            {
                $this->redis = new Redis();
                return $this->redis->connect('127.0.0.1','6379');
            }

            public function set($key,$value,$time=0)
            {
                if($time==0){
                    return $this->redis->set($key,$value);
                }else{
                    return $this->redis->setex($key,$time,$value);
                }
            }

            public function get($key)
            {
                return $this->redis->get($key);
            }

            public function del($key)
            {
                return $this->redis->delete($key);
            }
            public function close()
            {
                return $this->redis->close();
            }
        }
        
		#使用 memcache 做为缓存
	    class Memcaches implements Cache
	    {
	        private $memcache;
	
	        public function __construct()
	        {
	            $this->connect();
	        }
	        public function connect()
	        {
	            $this->memcache = new Memcache();
	            return $this->memcache->connect('127.0.0.1','11211');
	        }
	
	        public function set($key,$value,$time=0)
	        {
	            return $this->memcache->set($key,$value,false,$time);
	        }
	
	        public function get($key)
	        {
	            return $this->memcache->get($key);
	        }
	
	        public function del($key)
	        {
	            return $this->memcache->delete($key);
	        }
	        public function close()
	        {
	            return $this->memcache->close();
	        }
	    }
	    
    	#调用
		if($cache_config == 'redis'){
			# 使用 redis 
			$cache = new Rediss();  
		}else{
			# 使用 memcache
		    $cache = new Memcaches();
		}
		
		$cache->set('key','value');
        $cache->get('key'));
        $cache->del('key');
        $cache->close();	
    
		


5.注册模式

注册树模式通过将对象示例注册到一颗全局的对象树上, 需要的时候从对象树上采摘的模式设计方法。

代码示例:

 #注册模式
    class Register
    {
        #定义一个私有的变量
        private static $objects;
        # 注册类
        public static function set($key,$class)
        {
           if(!isset(self::$objects[$key])){
               self::$objects[$key] = $class;
           }
           return true;
        }
        #获取类的对象
        public static function get($key){
            if(!isset(self::$objects[$key])){
                return false;
            }
            return self::$objects[$key];
        }
        #取消注册类
        public static function unset_class($key){
            if(!isset(self::$objects[$key])){
                return false;
            }
            unset(self::$objects[$key]);
            return true;
        }
        #查看所有的类
        public static function all(){
            return self::$objects;
        }
    }
    # 定义一个类
    
	    #苹果手机类
	    class Apple{
	            public function __construct(){
	                echo '苹果手机:';
	            }
	            public function open(){
	                echo '开机';
	            }
	            public function close(){
	                echo '关机';
	            }
	    }
	    
	    #华为手机类
	    class HuaWei{
	        public function __construct(){
	            echo '华为手机:';
	        }
	        public function open(){
	            echo '开机';
	        }
	        public function close(){
	            echo '关机';
	        }
	    }
	    
	    #注册类
        Register::set('apple',new Apple());
        Register::set('huawei',new HuaWei());
		#获取类
       echo Register::get('apple')->close();#苹果手机:关机
       echo Register::get('huawei')->close();#华为手机:关机
       #查看所有注册类
        var_dump(Register::all());
        
6.观察者模式

观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe),它是一个在项目中经常使用的模式定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

优点:降低了类对象之间的耦合度。
缺点:观察者较多时,可能会花费一定的开销来发消息,但这个消息可能仅一个观察者消费。

代码示例:

 #观察者模式 
	 #把购买商品这个接口 当做被观察的对象 
	 #把通知商户 , 通知用户,记录日志 当做观察者
        #例子 购买商品成功 需要通知商户 通知用户 记录日志等操作

            #定义一个通知的接口
            interface Send{
                public function sendMsg();
            }

            #给商户发消息 观察者
            class Shop implements Send{
                public function sendMsg(){
                   echo '<pre> 用户下单成功 </pre>';
                }
            }
            #给用户发消息 观察者
            class User implements Send{
                public function sendMsg(){
                    echo '<pre> 购买商品成功 </pre>';
                }
            }
            #给日志发消息 观察者
            class Loggs implements Send{
                public function sendMsg(){
                    echo '<pre> xx用户在xx商户购买xx商品成功 </pre>';
                }
            }

            #定义一个接口
            interface obeject{
                public function addObeject($key);
            }

            # 被观察的对象
            class Order implements obeject{
                private $obeject;
                #绑定通知
                public function addObeject($key){
                        $this->obeject[]=$key;
                }
                #购买逻辑
                public function addOrder(){
                    #写下单逻辑
                    #下单成功通知
                    foreach ($this->obeject as $value){
                        $value->sendMsg();
                    }
                }
            }
            $order = new Order();
            $order->addObeject(new Loggs());#<pre> xx用户在xx商户购买xx商品成功 </pre>
            $order->addObeject(new Shop());#<pre> 购买商品成功 </pre>
            $order->addOrder();
            
  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
├<思库教育一阶段> │ ├1 div实现分块 给颜色;添表格.lxe │ ├1_html+css+js.zip │ ├10表单+input属性值.lxe │ ├2div如何平行显示.lxe │ ├3浮动(float)与清除(cleal)浮动.lxe │ ├4如何使用手册与表单张3作业.lxe │ ├5div布局小案例(民生银行)上.lxe │ ├6div布局小案例(民生银行)下.lxe │ ├7 CSS .lxe │ ├8经常犯的错误大整理.lxe │ ├9 ul+ul去点+外边距+浮动.lxe │ ├<html> │ │ ├[思库教育]第三集 基本常用标签.mp4 │ │ ├[思库教育]第五集 二进制原理,字符编码原理.wmv │ │ ├【思库教育】第二集 html设计思想和基本格式.mp4 │ │ ├【思库教育】第一集 网页介绍,环境与编辑器.wmv │ │ └第四集 排版标签.wmv │ ├<js> │ │ ├LXE文件播放说明.txt │ │ ├<day15> │ │ │ ├录像1.avi │ │ │ └录像2.avi │ │ ├<day16> │ │ │ ├[思库教育]JS 第二集 写一个程序输出1到100这些数字.avi │ │ │ ├[思库教育]JS 第六 集 数组初步 (1).avi │ │ │ ├[思库教育]JS 第七集 数组初步 (2).avi │ │ │ ├[思库教育]JS 第三集 经过多少次这个路口.avi │ │ │ ├[思库教育]JS 第四集 九九乘法表.avi │ │ │ ├[思库教育]JS 第五集 js系统内置函数.avi │ │ │ └[思库教育]JS 第一集 计算1到100的所有数的平方和.avi │ │ ├<day17> │ │ │ ├[思库教育]JS 第10集 数组常用方法.avi │ │ │ ├[思库教育]JS 第11集 冒泡排序.html.avi │ │ │ ├[思库教育]JS 第11集 字符串(对象)常见属性.avi │ │ │ ├[思库教育]JS 第12集 Math对象.avi │ │ │ ├[思库教育]JS 第13集 Date对象.avi │ │ │ ├[思库教育]JS 第8集 关联数组.avi │ │ │ └[思库教育]JS 第9集 二维数组.avi │ │ ├<day18> │ │ │ ├[思库教育]JS 第14集 作业讲解.avi │ │ │ ├[思库教育]JS 第15集 作业讲解.avi │ │ │ ├[思库教育]JS 第16集 作业讲解.avi │ │ │ ├[思库教育]JS 第17集 作业_获取一个长文件路径.avi │ │ │ └[思库教育]JS 第18集 作业假设30岁你要多少天去奋斗.avi │ │ ├<day19> │ │ │ ├[思库教育]JS 第19集 js事件对象.avi │ │ │ ├[思库教育]JS 第20集 js事件对象.avi │ │ │ ├[思库教育]JS 第21集 js事件对象.avi │ │ │ ├[思库教育]JS 第22集 js事件对象.avi │ │ │ └[思库教育]JS 第23集 js事件对象.avi │ │ ├<day20> │ │ │ ├[思库教育]JS 第24集 js作业.avi │ │ │ └[思库教育]JS 第25集 event对象.avi │ │ ├<day21> │ │ │ ├[思库教育]JS 第25集 作业.avi │ │ │ ├[思库教育]JS 第26集 window对象_1.avi │ │ │ └[思库教育]JS 第27集 window对象_2.avi │ │ ├<day22> │ │ │ └[思库教育]JS 第28集 window对象的定时器方法.avi │ │ ├<day23> │ │ │ ├[思库教育]JS 第28集 作业_图片轮播1.avi │ │ │ └[思库教育]JS 第29集 作业_图片轮播2.avi │ │ ├<day24> │ │ │ ├[思库教育]JS 第30集 各种找对象的奇葩方法.avi │ │ │ ├[思库教育]JS 第31集 window对象中的几个简单对象.avi │ │ │ ├[思库教育]JS 第32集 iframe内嵌窗口.avi │ │ │ └[思库教育]JS 第33集 DOM介绍.avi │ │ ├<day25> │ │ │ ├[思库教育]JS 第34集 当当网案例.avi │ │ │ ├[思库教育]JS 第35集 标签式浏览.avi │ │ │ └[思库教育]JS 第36集 节点操作.avi │ │ ├<day26> │ │ │ ├[思库教育]JS 第37集 表单验证.avi │ │ │ ├[思库教育]JS 第38集 对象动态绑定事件.avi │ │ │ ├[思库教育]JS 第39集 表格对象操作.avi │ │ │ └[思库教育]JS 第40集 元素滚动原理.avi ├<思库教育二阶段> │ ├<day1> │ │ ├[思库教育]php 第1集 网络认识及apache安装.avi │ │ ├[思库教育]php 第2集 apache配置_1.avi │ │ ├[思库教育]php 第3集 Apache配置_2.avi │ │ ├window-apache-php安装.doc │ │ └笔记.doc │ ├<day10> │ │ ├[思库教育]第25集 斐波纳挈数列.mp4 │ │ └[思库教育]第26集 数组的遍历.avi │ ├<day11> │ │ ├[思库教育]第27集 猴子吃桃.avi │ │ ├[思库教育]第28集 杨辉三角.avi │ │ ├[思库教育]第29集 数组传递.avi │ │ └[思库教育]第30集 数组操作.avi │ ├<day12> │ │ ├[思库教育]第31集 数组操作..avi │ │ ├[思库教育]第32集 数组操作.avi │ │ └[思库教育]第33集运算符.avi │ ├<day13> │ │ ├[思库教育]第34集 mysql数据库认识.avi │ │ ├[思库教育]第35集 mysql数据库连接.avi │ │ ├[思库教育]第36集 创建数据库.avi │ │ └[思库教育]第37集 创建表.avi │ ├<day14> │ │ ├[思库教育]第38集 crud.avi │ │ ├[思库教育]第39集 sql普通查询.avi │ │ └[思库教育]第40集 sql普通查询二.avi │ ├<day15> │ │ ├[思库教育]第41集 navcat图形化工具使用.avi │ │ ├[思库教育]第42集 表分析练习.avi │ │ ├[思库教育]第43集 数据库三范式.avi │ │ ├[思库教育]第44集 group by及聚合函数.avi │ │ └思库教育]第45集 group by及having.avi │ ├<day16> │ │ ├[思库教育]第46集 powerdesigner使用E-R图.avi │ │ └[思库教育]第47集 e-r图作业讲解.avi │ ├<day17> │ │ ├[思库教育]第48集 多表联查.avi │ │ ├[思库教育]第49集 多表联查练习.avi │ │ ├[思库教育]第50集 view视图.avi │ │ └[思库教育]第51集 事物.avi │ ├<day18> │ │ ├[思库教育]第52集 php操作mysql.avi │ │ └[思库教育]第53集 php操作mysql 增删改查案例.avi │ ├<day19> │ │ └[思库教育]第54集 案例-学生选课系统.avi │ ├<day2> │ │ ├[思库教育]php 第4集 apache深入.avi │ │ ├[思库教育]php 第5集apache多端口访问.avi │ │ ├[思库教育]php 第6集php安装.avi │ │ └[思库教育]php 第7集php配置.avi │ ├<day20> │ │ ├[北京思库教育]第55集 数据库分页.avi │ │ ├[北京思库教育]第56集 数据库分页二.avi │ │ └[北京思库教育]第57集 面向对象编程(OOP).avi │ ├<day21> │ │ ├[北京思库教育]第58集 构造方法.avi │ │ ├[北京思库教育]第59集 clone及静态方法.avi │ │ ├[北京思库教育]第60集 常量继承.avi │ │ └[北京思库教育]第61集 继承.avi │ ├<day22> │ │ └[北京思库教育]第62集 封装db类.avi │ ├<day23> │ │ ├[北京思库教育]第63集 访问控制..avi │ │ ├[北京思库教育]第64集 final.avi │ │ ├[北京思库教育]第65集 抽象类.avi │ │ ├[北京思库教育]第66集 接口.avi │ │ └[北京思库教育]第67集 自动加载.avi │ ├<day3_PHP最基本的语法> │ │ ├[思库教育]php 第8集 PHP如何执行?.avi │ │ ├[思库教育]php 第9集 php语法介绍.avi │ │ └[思库教育]php 第9集 超全局数组$_GET.avi │ ├<day4> │ │ ├[思库教育]php 第10集 超全局数组.avi │ │ ├[思库教育]php 第11集 在命令行执行php时,获得传递到php脚本的数据.avi │ │ ├[思库教育]php 第12 集字符串数据类型.avi │ │ └[思库教育]php 第13集 其它数据类型介绍.avi │ ├<day5> │ │ ├[思库教育]php 第14集 .数据类型转换.avi │ │ └[思库教育]php 第15集 流程控制语句.avi │ ├<day6> │ │ ├[思库教育]php 第16集 找出100之内的素数.avi │ │ └[思库教育]php 第17集 (include)文件引入.avi │ ├<day7> │ │ ├[思库教育]php 第18集 作业1 求红 白 黑 球.avi │ │ └[思库教育]php 第18集 作业公鸡、母鸡和小鸡各是多少只?.avi │ ├<day8> │ │ ├第19集 倒计时自动跳转.avi │ │ └第20集 计算器.avi │ ├<day9> │ │ ├[思库教育]第21集 函数.avi │ │ ├[思库教育]第22集 变量作用域.avi │ │ ├[思库教育]第23集 header及匿名函数.avi │ │ └[思库教育]第24集 静态局部变量.avi ├<思库教育三阶段> │ ├<day1> │ │ ├[北京思库教育]第68集 设计模式_单例.avi │ │ ├[北京思库教育]第69集 设计模式_工厂.avi │ │ ├[北京思库教育]第70集 序列化与反序列化.avi │ │ ├[北京思库教育]第71集 属性重载.avi │ │ └[北京思库教育]第72集 常见的类和对象操作函数.avi │ ├<day10> │ │ ├[北京思库教育]第100集大型电子商场开发实战.avi │ │ ├[北京思库教育]第101集 大型电子商场开发实战.avi │ │ └[北京思库教育]第102集 大型电子商场开发实战.avi │ ├<day11> │ │ ├[北京思库教育]第103集 大型电子商场开发实战缩略图.avi │ │ ├[北京思库教育]第104集 大型电子商场开发实战缩略图.avi │ │ ├[北京思库教育]第105集 大型电子商场开发实战商品列表.avi │ │ └[北京思库教育]第106集 大型电子商场开发实战.avi │ ├<day12> │ │ ├[北京思库教育]第107集 大型电子商场开发实战.avi │ │ ├[北京思库教育]第108集大型电子商场开发实战.avi │ │ ├[北京思库教育]第109集大型电子商场开发实战.avi │ │ └[北京思库教育]第110集 大型电子商场开发实战.avi │ ├<day13> │ │ ├[北京思库教育]第111集 大型电子商城开发实战.avi │ │ ├[北京思库教育]第112集 大型电子商城开发实战.avi │ │ ├[北京思库教育]第113集 大型电子商城开发实战.avi │ │ └[北京思库教育]第114集 大型电子商城开发实战.avi │ ├<day14> │ │ ├[北京思库教育]第115集 大型电子商城开发实战 开发实战.avi │ │ └[北京思库教育]第116集 大型电子商城开发实战.avi │ ├<day15> │ │ ├[北京思库教育]第116集 大型电子商城开发实战.avi │ │ ├[北京思库教育]第117集 大型电子商城开发实战PDO.mp4 │ │ ├[北京思库教育]第118集 大型电子商城开发实战PDO.avi │ │ └22.docx │ ├<day16> │ │ ├[北京思库教育]第118集 大型电子商城开发实战_thinkphp.avi │ │ ├[北京思库教育]第119集 大型电子商城开发实战_thinkphp.avi │ │ ├[北京思库教育]第120集 大型电子商城开发实战_thinkphp.avi │ │ └[北京思库教育]第121集 大型电子商城开发实战_thinkphp.avi │ ├<day17> │ │ ├[北京思库教育]第122集 大型电子商城开发实战_thinkphp.avi │ │ ├[北京思库教育]第123集 大型电子商城开发实战_thinkphp.avi │ │ ├[北京思库教育]第124集 大型电子商城开发实战_thinkphp.avi │ │ ├[北京思库教育]第125集 大型电子商城开发实战_thinkphp.avi │ │ └[北京思库教育]第126集 大型电子商城开发实战_thinkphp_uedit.avi │ ├<day18> │ │ └[思库教育]第127集 大型电子商城开发实战_thinkphp_关联模型.avi │ ├<day19> │ │ ├[思库教育]第128集 大型电子商城开发实战.avi │ │ ├[思库教育]第129集 大型电子商城开发实战.avi │ │ ├[思库教育]第130集 大型电子商城开发实战.avi │ │ └[思库教育]第131集 大型电子商城开发实战.avi │ ├<day2> │ │ ├[北京思库教育]第73集 文件及目录操作.avi │ │ ├[北京思库教育]第74集 目录操作.avi │ │ ├[北京思库教育]第75集 目录遍历.avi │ │ └[北京思库教育]第76集 目录遍历删除.avi │ ├<day20> │ │ ├[思库教育]第132集 大型电子商城开发实战.avi │ │ └[思库教育]第133集 大型电子商城开发实战.avi │ ├<day21> │ │ ├[思库教育]第133集 大型电子商城开发实战_正则表达式.avi │ │ ├[思库教育]第134集 大型电子商城开发实战_正则表达式.avi │ │ ├demo04.html │ │ └Lesson07.doc │ ├<day22> │ │ ├[思库教育]第135集 大型电子商城开发实战.avi │ │ ├[思库教育]第136集 大型电子商城开发实战.avi │ │ ├[思库教育]第137集 大型电子商城开发实战.avi │ │ ├[思库教育]第138集 大型电子商城开发实战.avi │ │ ├[思库教育]第139集 大型电子商城开发实战.avi │ │ └Lesson07.doc │ ├<day23> │ │ ├[思库教育]第139集 大型电子商城开发实战.avi │ │ └[思库教育]第140集 大型电子商城开发实战.avi │ ├<day24> │ │ ├[思库教育]第140集 大型电子商城开发实战_thinkphp自动验证.avi │ │ └[思库教育]第141集 大型电子商城开发实战_thinkphp.avi │ ├<day25> │ │ ├[思库教育]第142集 大型电子商城开发实战_面包屑导航.avi │ │ ├[思库教育]第143集 大型电子商城开发实战_面包屑导航.mp4 │ │ └[思库教育]第144集 大型电子商城开发实战_商品详细页.avi │ ├<day3> │ │ ├北京思库教育]第77集 shop项目一.avi │ │ ├北京思库教育]第78集 shop项目二.avi │ │ ├北京思库教育]第79集 shop项目三.avi │ │ ├北京思库教育]第80集 shop项目四.avi │ │ └北京思库教育]第81集 shop项目五.avi │ ├<day4> │ │ ├[北京思库教育]第82集 shop项目六.mp4 │ │ ├[北京思库教育]第83集 shop项目七.avi │ │ └17.docx │ ├<day5> │ │ ├[北京思库教育]第84集 shop项目八.avi │ │ ├[北京思库教育]第85集 shop项目九.avi │ │ ├[北京思库教育]第86集 shop项目十.avi │ │ └[北京思库教育]第87集 shop项目十一.avi │ ├<day6> │ │ ├[北京思库教育]第88集 shop项目十二.avi │ │ └[北京思库教育]第89集 shop项目十三.avi │ ├<day7> │ │ ├[北京思库教育]第90集 shop项目十四.avi │ │ ├[北京思库教育]第91集 shop项目十五.avi │ │ └[北京思库教育]第92集 shop项目十四.avi │ ├<day8> │ │ ├[北京思库教育]第93集 shop项目十五.avi │ │ ├[北京思库教育]第93集 大型电子商场开发实战.avi │ │ ├[北京思库教育]第94集 shop项目十六.avi │ │ ├[北京思库教育]第94集 shop项目十七.avi │ │ ├[北京思库教育]第94集大型电子商场开发实战.avi │ │ └[北京思库教育]第95集 大型电子商场开发实战.avi │ ├<day9> │ │ ├[北京思库教育]第96集 大型电子商场开发实战.avi │ │ ├[北京思库教育]第97集 大型电子商场开发实战.avi │ │ ├[北京思库教育]第98集大型电子商场开发实战.avi │ │ └[北京思库教育]第99集 大型电子商场开发实战.avi 课程内容与官方发布的完全一致,可能目录编排有点小问题,内容是完整的
PHP是最流行的Web脚本语言之一,它运行在Web服务器端,根据用户请求或服务器端的数据产生动态网页;它功能强大,和HTML脚本融合在一起,并内建访问数据库的能力;它能够作为Apache Web 服务器的模块执行,也使得其执行效率要高于普通的CGI程序。本书作者是一位经验丰富的程序员,在书中使用了大量的、有一定使用价值的例子来深入浅出地讲解PHP语言及Web编程需要了解的方方面面。尤其值得注意的是,书中使用了多个“中场”章节,以便在学习过一定知识之后,通过实际例子来对所学的知识进行巩固,这些章节介绍的内容具有很强的实用价值。因此本书不仅对Web编程的入门者,即使对于有一定经验的Web程序员来讲,也是非常有用的。 目 录 译者序 前言 第1章 什么是PHP 1 1.1 起源 1 1.2 特性 1 1.3 PHP需要花费多少钱 2 1.4 PHP语言可以嵌入HTML中 2 1.5 PHP语言是在Web服务器端运行 3 1.6 PHP无处不在 3 1.7 PHP和C或Java相似吗 3 1.8 PHP比ColdFusion、Active Server Pages 或Java Server Pages更好吗 3 1.9 总结 4 第2章 安装PHP 5 2.1 基本概念 6 2.2 编译前的准备工作 7 2.3 编译C编译器gcc 8 2.4 编译MySQL 8 2.5 测试MySQL 9 2.6 编译iODBC和MyODBC 12 2.7 编译PHP 12 2.8 安装PHPLIB 15 2.9 测试Linux环境下的ODBC 18 2.10 总结 18 第3章 PHP中的数据处理 19 3.1 数值 19 3.1.1 数字 19 3.1.2 文本 20 3.2 变量 23 3.2.1 标量 23 3.2.2 数组变量 24 3.2.3 多维数组 27 3.2.4 变量替换 28 3.2.5 动态变量名 31 3.3 常量 31 3.4 操作符 31 3.4.1 操作符的优先级 32 3.4.2 三重操作符 33 3.4.3 算术操作符 34 3.4.4 条件操作符 35 3.4.5 一元操作符 35 3.4.6 位操作符 37 3.4.7 字符串连接操作符 38 3.4.8 逻辑操作符 38 3.4.9 赋值操作符 40 3.5 总结 41 第4章 程序控制 43 4.1 表达式 43 4.1.1 简单表达式 43 4.1.2 有副作用的简单表达式 43 4.1.3 复杂表达式 44 4.2 语句 44 4.3 函数 55 4.3.1 函数返回值 56 4.3.2 向函数传递参数 58 4.3.3 给函数赋予缺省值 59 4.3.4 控制变量的作用域 60 4.3.5 嵌套函数调用 61 4.3.6 递归函数 61 4.4 总结 65 第5章 中场一:数据库连接 67 5.1 开端 67 5.2 创建连接 67 5.3 获取HTML表单信息 69 5.4 使用HTML表单信息 70 5.5 common.inc文件 72 5.6 总结 73 第6章 数据库和SQL 74 6.1 信息和数据有何不同 74 6.2 从信息向数据库转移 74 6.3 创建唯一的记录 75 6.4 每个记录的重要字段 75 6.5 有关字段数据类型的一两句话 76 6.6 设计能存储电子邮件消息的字段 76 6.7 SQL介绍 76 6.7.1 SQL Create Table语句 77 6.7.2 SQL Alter Table语句 79 6.7.3 SQL 的删除表语句 82 6.7.4 SQL的插入语句 83 6.7.5 SQL 的更新语句 83 6.7.6 SQL的查询语句 84 6.8 SQL Delete 语句 90 6.9 字段定义及修正 91 6.9.1 使用索引或关键字段来加快查询 91 6.9.2 使用自动增量创建键 92 6.10 总结 92 第7章 中场二:列表维护 94 7.1 列表维护的规范 94 7.2 创建连接代码 94 7.3 创建phpuser用户名 95 7.4 创建数据库表 96 7.5 修改menu.php3文件 97 7.6 插入记录 97 7.6.1 定义插入表单 97 7.6.2 处理插入动作 99 7.6.3 检查动态SQL的建立 100 7.6.4 验证插入 101 7.7 显示记录 101 7.7.1 增加排序记录的能力 104 7.7.2 同时显示五个记录 106 7.7.3 删除记录 109 7.7.4 编辑记录 111 7.7.5 复制记录 113 7.8 为新表配置应用程序 116 7.9 总结 116 第8章 phpMyAdmin:开放源码的 MySQL前端 117 8.1 phpMyAdmin的特性 117 8.2 安装phpMyAdmin 118 8.3 防止“网络机器人” 118 8.4 用密码保护phpMyAdmin目录 119 8.5 使用phpMyAdmin 119 8.6 函数变量:转储表中数据 120 8.7 Query By Example,构造用户自 定义页面 122 8.8 构建多语言网站 124 8.9 常见问题 127 8.10 总结 127 第9章 模式匹配 129 9.1 正则表达式定义 129 9.1.1 方括号表达式 130 9.1.2 转义字符 130 9.2 POSIX风格的函数 131 9.2.1 ereg 和eregi 131 9.2.2 ereg_replace 和eregi_replace 132 9.2.3 Split 133 9.3 PERL风格函数 134 9.3.1 模式定界符 134 9.3.2 模式选项 135 9.3.3 PERL风格转义字符 136 9.3.4 扩展模式记号 136 9.3.5 preg_match 函数 138 9.3.6 preg_match _all 函数 139 9.3.7 preg_replace函数 141 9.3.8 preg_split函数 143 9.3.9 模式举例 143 9.3.10 匹配举例 144 9.3.11 替换举例 148 9.3.12 分割举例 150 9.4 MySQL …151 9.4.1 LIKE 151 9.4.2 RLIKE 152 9.5 总结 152 第10章 面向对象 154 10.1 了解类的知识 154 10.1.1 继承 155 10.1.2 抽象 155 10.1.3 多态 156 10.1.4 封装 157 10.2 对象和PHP 157 10.2.1 使用命名参数 158 10.2.2 使用继承 160 10.2.3 存取类属性 160 10.2.4 多态性函数 161 10.2.5 在类中定义类 162 10.2.6 引用:所指的值就是我的数据 165 10.2.7 有用的类函数 166 10.3 总结 166 第11章 中场三:生成HTML模块 168 11.1 HTML类的设计目的 168 11.2 生成一个基类 169 11.3 继续进行下一步 171 11.4 巩固通用函数 172 11.5 添加head支持 173 11.6 添加body支持 175 11.7 添加title支持 179 11.8 添加注释支持 180 11.9 添加对通用标签的支持 183 11.10 添加缺省值支持 183 11.11 缓存HTML代码 184 11.12 总结 187 第12章 什么是CGI 189 12.1 CGI应用程序和Java Applet 189 12.2 CGI应用程序和JavaScript 190 12.3 自己编写脚本 190 12.4 CGI是如何工作的 190 12.5 调用CGI程序 190 12.6 HTTP标题 191 12.7 CGI和环境变量 192 12.8 URL编码和解码 194 12.8.1 使用rawurlencode函数 194 12.8.2 自动解码 194 12.9 安全性 195 12.10 cookie 195 12.10.1 cookie安全性 196 12.10.2 如何设置和读取cookie 196 12.10.3 客户端浏览器支持cookie吗 197 12.11 调试CGI程序 198 12.11.1 把输出发送到服务器日志 文件中 198 12.11.2 生成错误处理HTML页面 199 12.12 表单处理 200 12.12.1 HTML简介 200 12.12.2 HTML表单 201 12.12.3 传递表单信息 203 12.13 总结 203 第13章 认证 205 13.1 HTTP认证 205 13.2 htaccess 认证 208 13.2.1 用户文件 208 13.2.2 配置apache服务器 208 13.2.3 简单数据库认证 210 13.3 总结 213 第14章 深入了解SQL 214 14.1 表关联 214 14.2 创建数据库表 215 14.3 通过连接生成虚拟表 218 14.4 使用链接表 219 14.5 几种连接类型 222 14.5.1 左连接 222 14.5.2 正则左连接 223 14.5.3 Using选项 223 14.6 处理空值 224 14.7 完整性 225 14.8 总结 226 第15章 中场四:管理并发访问 228 15.1 问题:一个用户能覆盖另一 个用户的更改 228 15.1.1 创建并发数据库 228 15.1.2 程序及图解 228 15.2 解决方案:阻止多用户编辑 235 15.2.1 跟踪编辑会话 236 15.2.2 设计解决方案 236 15.3 总结 248 第16章 XML 249 16.1 为什么使用XML 249 16.1.1 混合结构和显示 250 16.1.2 异类浏览器 250 16.1.3 不适合非Web用途 250 16.1.4 在数据交换方面不实用 251 16.2 XML解决方法 251 16.2.1 HTML和XML的差异 251 16.2.2 XML分析器的作用 252 16.3 XML核心 252 16.3.l 标识和文本 252 16.3.2 注解 256 16.3.3 总体文档结构 256 16.3.4 有效及形式好的文档 257 16.4 文档类型定义(DTD) 258 16.4.1 一般形式 258 16.4.2 ELEMENT关键字 258 16.4.3 ATTLIST关键字 260 16.4.4 ENTITY关键字 262 16.4.5 NOTATION关键字 263 16.5 XML应用程序 264 16.5.1 DocBook 264 16.5.2 同步多媒体集成语言(SMIL) 264 16.6 XML是什么样的 265 16.7 进一步研究 267 16.8 总结 267 第17章 用PHP处理XML 269 17.1 得到电影信息 269 17.1.1 与XML分析器协作 270 17.1.2 从XML到PHP 273 17.2 总结 276 附录A Internet资源 277 附录B ASCII表 282 附录C SQL语言参考 288 附录D PHP函数清单 307 附录E CD-ROM的内容 332

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值