php Builder建造器模式学习笔记

 更新时间:2016年11月25日 14:58  点击:2313
星际里面有不少的任务关,也可以自己编辑地图,画面上有各种地形,建筑和部队,存在一个问题,初始化画面的流程很乱。待解决的问题:完成初始化画面的工作,同时尽量减少各种绘制细节的耦合

思路:既然星际的画面由几个部分组成:地图(就是地形和矿产),建筑,部队。那么我们把他们看成是零件,组装起来就是最后的产品(整个画面)。


建造器(Builder)模式示例:

 代码如下 复制代码

<?php

//规范制造各个零件的接口

interface Builder

{

  //制造地图零件

  public function buildMapPart();

  //制造建筑零件

  public function buildBuildingPart();

  //制造部队零件

  public function buildArmyPart();

  //组装零件

  public function getResult();

}

//实际建造器类,比如初始化某个任务关

class ConcreteBuilder implements Builder

{

  //制造地图零件

  public function buildMapPart()

  {

  //根据任务的设定画上地图

  echo '地图零件n';

  }

  //制造建筑零件

  public function buildBuildingPart()

  {

  //根据任务的设定画上建筑,包括玩家的和敌人的

  echo '建筑零件n';

  }

  //制造部队零件

  public function buildArmyPart()

  {

  //根据任务的设定画上部队,包括玩家的和敌人的

  echo '部队零件n';

  }

  //组装零件

  public function getResult()

  {

  //将所有的东西叠加和处理,形成初始化画面

  echo '组装零件n';

  }

}

//监督类,也就是控制绘制流程的类

class Director

{

  //私有属性,确定使用的建造器

  private $builder;

  //构造方法,参数为选定的建造器对象

  public function __construct($builder)

  {

    //确定使用的建造器

    $this->builder = $builder;

  }

  //负责建造流程的方法,调用建造器对象的方法,制造所有零件

  public function buildeAllPart()

  {

    //制造地图零件

    $this->builder->buildMapPart();

    //制造建筑零件

    $this->builder->buildBuildingPart();

    //制造部队零件

    $this->builder->buildArmyPart();

  }

}

//假设根据任务关,初始化我们需要的实际建造器对象

$concreteBuilder = new ConcreteBuilder();

//初始化一个监督对象

$director = new Director($concreteBuilder);

//制造所有零件

$director->buildeAllPart();

//最后让建造器组装零件,生成画面

$concreteBuilder->getResult();

?>

用途总结:建造器模式可以将流程和细节分离,各司其职。


实现总结:需要一个建造器接口或者抽象类,负责规范各个方法,比如上面的Builder。然后让实际的建造器类去实现所有的方法,比如上面的ConcreteBuilder。同时需要负责流程管理的监督类,比如上面的Director,负责调用建造器的各个零件制造方法。最后让建造器去组装所有的零件

php变量是一个弱类型了我们可以进行各数据类型之后的快速转换,下面整理了一下关于php变量与常量的使用例子,希望这些例子对各位学习php会有帮助。

PHP是弱类型的语言

PHP中共有8中类型
  4种标量 //只能存储一个值)
           1.整  型:int integer
           2.布尔型:bool boolean
           3.浮点型:float,double,real
           4.字符型:string
  2种复合类型 //一个变量能存储多个值
           1.数组:array //只能存储多个变量
           2.对象:object //可存变量以及函数
  2中特殊类型
           1.资源类型:resource
           2.空 类 型:null
   
    例子:Var_dump(变量或值); //即可以查看变量或值的类型,又可以看数据
 
 
 代码:
 
<?php
//输出整数型
    $var=10;
 
echo "<pre>"; //<pre>标签是以代码原形输出
var_dump($var);//输出结果:int(10),意思是为整数型,值为10
echo "</pre>";
 
echo "----------------------<br>";

//输出浮点型
    $var=11.11;
 
echo "<pre>";
var_dump($var);//输出结果:float(11.11),意思是为浮点型,值为11.11
echo "</pre>";
 
echo "----------------------<br>";
 
//输出布尔型
    $var=true;
 
echo "<pre>";
var_dump($var);//输出结果:bool(true),意思是为布尔型,值为true
echo "</pre>";
 
echo "----------------------<br>";
//输出字符型
    $var="mk";
 
echo "<pre>";
var_dump($var);//输出结果:string(2) "mk",意思是为字符型,值为mk
echo "</pre>";
 
echo "----------------------<br>";
//输出数组
    $var=array(1,2,3);
 
echo "<pre>";
var_dump($var);
echo "</pre>";
 
echo "----------------------<br>";
 ?>

数据类型的转换


一种是强制转换:

        1.setType(变量,类型);//类型int,integer,float,double,real,bool,boolena,string,array,object
        这个函数将原变量的类型改变,var_dump();

            代码:

                 $str="100.1254abc";
                 setType($str,int);
                 var_dump($str);

         2.在赋值前使用(类型)的形式,不会改变原变量的类型($a=(int)$str;)

             代码:

                 $str="100.1254abc";
                 $a=(int)$str;
                 var_dump($a);
                 var_dump($str);

          3.$变量=intval(变量或值);
            $变量=float(变量或值);
            $变量=stringval(变量或值);

              代码:

                  $str="100.1254abc";
                  $a=intval($str);
                  var_dump($a);

          注意:整型在内存中占4个字节
                浮点型在内存中占8个字节

  一种是自动转换(这是PHP最常用的方式,因为这种我们开发时不用去管理类型,变量会根据运行环境自动转换)

              代码:

                  $a=10;
                  $b=true;
                  $c="100abc";
                  $d=12.14;

                  $sum=$a+$b+$c+$d;
                  var_dump($sum);

  与变量和类型有关的一些常用函数

        isset();  //是判断变量存不存在,值如果是null,也表示空
          代码:
         $a="";
      if(isset($a)){
            echo "存在";
      }else{
            echo "不存在";
      }

        empty();  //判断一个变量是否为空,如 ""   null
           代码:
         $a="";
      if(empty($a)){
             echo "null";
      }else{
             echo "No null";
      }

        unset();
        setType();
        getType();
 
  变量类型测试函数
 
    is_bool();
    is_int(); is_integer(); is_long();
    is_string();
    is_float(); is_double(); is_real();
    is_array();
    is_object();
    is_resource();
    is_null();
   
    is_scalar();
    is_numberic();
    is_callable();

  常量的声明与使用
    1.常量是一个简单的标识符
    2.常量定以后不能再改变他的值,也不能使用unset()取消
    3.常量可以不用理会变量范围的规则而在任何地方都可以定义和访问
    4.常量使用define("常量名",值)
    5.常量名在声明和使用都不使用"$"
    6.常量名称习惯使用大写
    7.常量的值只能用标量类型(int,float,bool,string)
    8.常量一定要在声明时就给值
    9.defined("常量")  //判断常量存不存在
   
          代码:
           define("MK","Morker");
               echo MK;
       
   defined();
         代码:
           define("MK2B","Morker");

             if(defined("MK")){
       
             echo MK;
       
        }else{
       
             define("MK",504815135);
       
        }
        echo MK;

下面我们一起来看一个php 使用反射获取类的文件路径的例子,希望此例子对大家有帮助。
 代码如下 复制代码

<?php
$pc_base =new pc_base();
$object = new ReflectionObject($pc_base);
//load_app_class 是类中的一个方法

$method = $object->getMethod('load_app_class');
$declaringClass = $method->getDeclaringClass();
$filename = $declaringClass->getFilename();
print_r($filename);
 
?>

在php中自动加载我们会使用到方法__autoload spl_autoload_register来实现,像我们有几百个类时我们希望是希望使用__autoload来创建,然后直接创建类名就可以了,下面简单的总结了一下自动加载类的用法,希望对各位有帮助。

在PHP5之前,各个PHP框架如果要实现类的自动加载,一般都是按照某种约定自己实现一个遍历目录,自动加载所有符合约定规则的文件的类或函数。 当然,PHP5之前对面向对象的支持并不是太好,类的使用也没有现在频繁。 在PHP5后,当加载PHP类时,如果类所在文件没有被包含进来,或者类名出错,Zend引擎会自动调用__autoload 函数。此函数需要用户自己实现__autoload函数。 在PHP5.1.2版本后,可以使用spl_autoload_register函数自定义自动加载处理函数。当没有调用此函数,默认情况下会使用SPL自定义的spl_autoload函数。 看下面两个例子:

1、 __autoload示例:

 代码如下 复制代码

function __autoload($class_name) {
   echo '__autload class:', $class_name, '<br />';
}
new Demo();

以上的代码在最后会输出:__autload class:Demo。
并在此之后报错显示: Fatal error: Class 'Demo' not found

2、spl_autoload_register示例:

 代码如下 复制代码

function classLoader($class_name) {
    echo 'SPL load class:', $class_name, '<br />';
}
spl_autoload_register('classLoader');
new Demo();

以上的代码在最后会输出:SPL load class:Demo。
并在此之后报错显示: Fatal error: Class 'Demo' not found

以上的两个示例表明:当类不存在时(即需要的类不在类符号表),Zend引擎会将再调用一次用户定义的函数,如__autoload或spl_autoload_register注册的函数。 如果这两个方法同时存在,那么程序会调用哪一个呢?还是说两个都调用?看下面一个示例,你觉得会输出什么呢?

 代码如下 复制代码

function __autoload($class_name) {
    echo '__autload class:', $class_name, '<br />';
}
function classLoader($class_name) {
    echo 'SPL load class:', $class_name, '<br />';
}
spl_autoload_register('classLoader');
new Demo();

 __set、__tostring等类的魔法方法的常量定义在源码级别是一起的, 可是它并不是专属于某个类的魔法方法。它是所有的类共用的自动加载魔术方法。 它将作为一个全局函数存在。那么Zend引擎是如何在类没有找到时调用这个方法的呢?

不管是使用new关键字创建类的实例,还是使用implement实现接口,或者继承某个类, 所有的这些操作都有可能调用__autoload函数。这几个操作在源码层都有一个共同点,它们在执行的时候都需要获取类的信息(接口在本质上也是一个类)。 它们在最终都会调用 zend_fetch_class (Zend/zend_execute_API.c)函数,这个函数本身没有多少内容,关键是它调用了zend_lookup_class_ex(Zend/zend_execute_API.c)函数, 这个函数就是类的自动加载的真相所在。

在zend_lookup_class_ex函数中,我们看到程序会首先查询类符号表,如果存在类直接返回。如果不存在,就会执行我们所说的自动加载了。这里针对__autoload函数和spl相关的函数都做了处理,并且以第一参数和第二参数传递给Zend引擎的函数调用函数zend_call_function。

在zend_call_function函数中,它会判断第二参数是否存在函数,如果存在函数则只会调用第二个参数传递的函数(这里指SPL注册的函数)。如果第二个函数没有值,则执行第一个参数传递过来的函数(这里指用户定义的__autoload函数)。到这里,我想前面提到的两个方法同时存在的情况应该就有答案了,这也算是一篇基于的php教程了。

$a+$a++ 与 $a+$a+$a++的结果是多少,这个对于很多程序员来讲几乎是都会做错的,那么$a+$a++ 与 $a+$a+$a++最后会是什么结果?下面我们一起来看看吧。

让我们来先看一道题:

<?php

$a = 1;
$b = $a + $a++; //结果:$a=2,$b=3
这道题不是很难,显然在PHP中 ++ 的优先级比 + 高,所以先执行 $a++,这时 $a的值为2
再看一题:

<?php

$a = 1;
$b = $a + $a + $a++;
这时 $b 的值应该是多少呢?
答案是:3

为什么还是3呢?不是 ++ 的优先级比 + 高吗?先执行 $a++ 后,$a的值应该是2,结果是5才对啊。

其实这是正确答案是 3,一开始自己也认为应该是5。

解释:

运算符是从左边往右结合的,上面的表达式相当于

$ = ($a+$a) + $a++

根据左结合的原则
//先计算 $a+$a
$b = 2 + $a++;

//这时就要比较 + 和 ++ 的运算符优先级了

$b = 2 + 1; //这时$a = 2

这是都是蛋疼的PHP笔试题,在实际项目代码中应该使用括号来避免这些问题的出现。

[!--infotagslink--]

相关文章

  • javascript设计模式之解释器模式详解

    神马是“解释器模式”?先翻开《GOF》看看Definition:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。在开篇之前还是要科普几个概念: 抽象语法树: 解释器模式并未解释如...2014-06-07
  • Postgresql 如何选择正确的关闭模式

    这篇文章主要介绍了Postgresl 如何选择正确的关闭模式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-18
  • 学习JavaScript设计模式之装饰者模式

    这篇文章主要为大家介绍了JavaScript设计模式中的装饰者模式,对JavaScript设计模式感兴趣的小伙伴们可以参考一下...2016-01-21
  • 如何开启mysql中的严格模式

    很多集成的PHP环境(PHPnow WAMP Appserv等)自带的MySQL貌似都没有开启MySQL的严格模式,何为MySQL的严格模式,简单来说就是MySQL自身对数据进行严格的校验(格式、长度、类型等),比如一个整型字段我们写入一个字符串类型的数...2013-10-04
  • php上传图片学习笔记与心得

    我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
  • Smarty模板学习笔记之Smarty简介

    1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
  • c#标准idispose模式使用示例

    下面将把C#里实现IDispose模式的代码展现出来,大家一起来学习一下,它的使用场合也很多的,当我们手动对网站,数据库作封装时,都会用的到...2020-06-25
  • C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?

    这篇文章主要介绍了C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?,这也小编做.NET项目时经常思考和让人混乱的一个问题,这篇文章写的挺好,一下清晰了许多,需要的朋友可以参考下...2020-06-25
  • JavaScript设计模式之职责链模式

    这篇文章主要介绍了JavaScript设计模式之职责链模式,对设计模式感兴趣的同学,可以参考下...2021-04-25
  • php Observer观察者模式之学习笔记

    当我们在星际中开地图和几家电脑作战的时候,电脑的几个玩家相当于结盟,一旦我们出兵进攻某一家电脑,其余的电脑会出兵救援。 那么如何让各家电脑知道自己的盟友被攻击了...2016-11-25
  • 学习JavaScript设计模式之状态模式

    这篇文章主要为大家介绍了JavaScript设计模式中的状态模式,对JavaScript设计模式感兴趣的小伙伴们可以参考一下...2016-01-12
  • Java接口DAO模式代码原理及应用详解

    这篇文章主要介绍了Java接口DAO模式代码原理及应用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-03
  • C#中的IDisposable模式用法详解

    这篇文章主要介绍了C#中的IDisposable模式用法,讲述了垃圾资源回收机制的实现,并对比分析了Dispose()方法、~DisposableClass()析构函数、虚方法Dispose(bool disposing)的原理,需要的朋友可以参考下...2020-06-25
  • 阿里云OpenSearch在php版sdk开启调试模式

    版本:php_v2.0.6 在CloudsearchClient的类中,开启debug模式,设置为true 如:$opts = array(&#39;host&#39;=>$host,&#39;debug&#39;=>true); 注意true不能加引号...2016-05-19
  • C#使用Dispose模式实现手动对资源的释放

    这篇文章主要介绍了C#使用Dispose模式实现手动对资源的释放,涉及C#采用Dispose模式操作资源的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 学习JavaScript设计模式之单例模式

    这篇文章主要为大家介绍了JavaScript设计模式中的单例模式,对JavaScript设计模式感兴趣的小伙伴们可以参考一下...2016-01-21
  • MIUI儿童模式如何开启 小米手机儿童模式开启教程

    您是否遇到过孩子想要玩手机又不好拒绝,或者是您想要给孩子配一个联系用的手机有担心孩子玩手机上瘾?如果您购买的是小米手机,那么MIUI的儿童模式就能很好地解决这个问题...2016-12-21
  • JavaScript设计模式之命令模式

    这篇文章主要介绍了JavaScript设计模式之命令模式,对设计模式感兴趣的同学,可以参考下...2021-04-25
  • PHP 日期函数 学习笔记介绍

    举一个简单的date例子 我将使用echo命令把内容输出到我们的客户端(浏览器)。我将使用下面的代码做为基础代码。 代码如下 复制代码 <!DOCTY...2016-11-25
  • PHP单例模式静态类解析和实现源代码

    我们建站的时候,开始是每次请求数据库都要重新连接的、这样显然不合理、然后自己封装了一个数据库操作类、DBTools.php、要解决一个连接多次使用的话、最好的办法是使...2016-11-25