PHP面向对象之标识对象

by admin on 2019年9月24日
 1 <?php  2     // 声明一个变量并赋值 3     $a = 1; 4     // 将数据类型的值 赋值 给一个变量 5     $b = $a; 6  7     // 修改$a的值 8     $a = 2; 9     // $a和$b是两个独立的内存空间修改其中一个另一个不受影响10     echo $b; // 1 11 12     class Person13    {14         public $name;15         public $age;16    }17     // 将对象类型的数据 赋值 给一个变量18     $p = new Person;19     // 通过对属性修改值,来确定面向对象中 对象的传值方式20     $p->name = 'jesse';21     // 若是成功修改值,则是引用传值 22     echo $p->name; // jesse23 ?>

PHP面向对象之对象传值格局,php面向对象对象

 1 <?php 
 2     // 声明一个变量并赋值
 3     $a = 1;
 4     // 将数据类型的值 赋值 给一个变量
 5     $b = $a;
 6 
 7     // 修改$a的值
 8     $a = 2;
 9     // $a和$b是两个独立的内存空间修改其中一个另一个不受影响
10     echo $b; // 1 
11 
12     class Person
13    {
14         public $name;
15         public $age;
16    }
17     // 将对象类型的数据 赋值 给一个变量
18     $p = new Person;
19     // 通过对属性修改值,来确定面向对象中 对象的传值方式
20     $p->name = 'jesse';
21     // 若是成功修改值,则是引用传值 
22     echo $p->name; // jesse
23 ?>

案例表明: 

在那边透过变量的赋值情势 与
对象的赋值格局方法绝比较,代码第5行中的赋值格局为“拷贝赋值”,故在修改其源值($a的值)的景色下,$b的值不受影响。$a与$b的内部存储器关系图如下:

澳门威斯尼人平台登陆 1

 

而代码20行将数据类型赋值给$p变量,通过$p修改对象内部的值成功,相比较变量的传值格局,申明那是援用传值,内部存款和储蓄器关系图如下:

澳门威斯尼人平台登陆 2

 

那二种最基本的搞精通后,大家对面向对象传值方式举行深化,请看一下代码:

 1 <?php 
 2     class Person
 3     {
 4         public $name;
 5         public $age;
 6     }
 7     // 将对象类型的数据 赋值 给一个变量
 8     $p = new Person;
 9     // 通过对属性修改值,来确定面向对象中 对象的传值方式
10     $p->name = 'jesse';
11     // 将对象赋予另一变量
12     $m = $p;
13     // 另一变量修改属性值
14     $m->name = 'Marry';
15     // 输出源变量 赋值变量访问内部属性的结果
16     echo $p->name, $m->name;
17 ?>

 第12行代码为本篇作品的最“点睛”的代码,等号侧边为是一个目的,右侧是一个变量,那么犀利的标题来了,$m是将目的拷贝一份?照旧按援用传递呢?该代码内部存款和储蓄器关系如下:

澳门威斯尼人平台登陆 3

 

由此,最终五个指标的属性值均被更改为Marry!!!

那按援用传值会是怎么个状态?

 

 1 <?php 
 2     class Person
 3     {
 4         public $name;
 5         public $age;
 6     }
 7     // 将对象类型的数据 赋值 给一个变量
 8     $p = new Person;
 9     // 通过对属性修改值,来确定面向对象中 对象的传值方式
10     $p->name = 'jesse';
11     // 将对象赋予另一变量
12     $m = &$p;
13     // 另一变量修改属性值
14     $m->name = 'Marry';
15     // 输出源变量 赋值变量访问内部属性的结果
16     echo $p->name, $m->name;
17 ?>

 澳门威斯尼人平台登陆 4

                                     ——
Create By Jesse 2018.01.22

 

1 ?
php 2 // 扬言一个变量并赋值 3 $a = 1 ; 4 // 将数据类型的值 赋值
给三个变量 5 $b = $a ; 6 7 /…

  1. /*
  2. 标志对象形式
  3. 其一形式首要功效就是创设sql语句中的wehre条件字符串的,下边直接看代码和注释:
    1. */
  4. namespace woo\mapper;
      1. //字段对象
  5. class Field {
  6.     protected $name = null;          //字段名称
  7.     protected $operator = null;         //操作符    
  8. 澳门威斯尼人平台登陆,    protected $comps = array();         //存放条件的数组    
  9.     protected $incomplete = false;     //检查标准数组是还是不是有值
  10.     
  11.     function __construct ($name){
  12.         $this->name= $name;
  13.     }
  14.     
  15.     //添加where 条件
  16.     function addTest($operator,$value){
  17.         $this->comps[] =
    array(‘name’=>$this->name,’operator’=>$operator,’value’=>$value);
  18.     }
  19.     
  20.     //获取贮存条件的数组
  21.     function getComps(){
  22.         return $this->comps;
  23.     }
  24.     
  25.     function isIncomplete(){
  26.         return empty($this->comps);
  27.     }
  28. }
      1. //标志对象
  29. class IdentityObject {
  30.     protected $current田野同志 = null;        //当前操作的字段对象
  31.     protected $田野(field)s = array();        //字段会集
  32.     private $and = null;
  33.     private $enforce = array();            //限定的法定字段        
  34.     
  35.     function __construct($field = null, array $enforce = null){
  36.         if(!is_null($enforce)){
  37.             $this->enforce = $enforce;
  38.         }
  39.         if(!is_null($field)){
  40.             $this->field($field);
  41.         }
  42.     }
  43.     
  44.     //获取范围的法定字段
  45.     function getObjectFields(){
  46.         return $this->enforce;
  47.     }
  48.     
  49.     //重要功用为设置当前亟待操作的指标
  50.     function field($fieldname){
  51.         if(!$this->isVoid()&&
    $this->currentfield->isIncomplete()){
  52.             throw new \Exception(“Incomplete field”);
  53.         }
  54.         $this->enforceField($fieldname);
  55.         if(isset($this->fields[$fieldname]){
  56.             $this->currentfield = $this->fields[$fieldname];
  57.         } else {
  58.             $this->currentfield = new Field($fieldname);
  59.             $this->fields[$fieldname] = $this->currentfield;
  60.         }
  61.         return $this;                    //采取连贯语法
  62.     }
  63.     
  64.     //字段群集是不是为空
  65.     function isVoid(){
  66.         return empty($this->fields);
  67.     }
  68.     
  69.     //检查字段是还是不是合法
  70.     function enforceField ($fieldname){
  71.         if(!in_array($fieldname,$this->enforce) &&
    !empty($this->enforce)){
  72.             $forcelist = implode(‘,’,$this->enforce);
  73.             throw new \Exception(“{$fieldname} not a legal field
    {$forcelist}”);
  74.         }
  75.     }
  76.     
  77.     
  78.     //向字段对象加多where条件
  79.     function eq($value){
  80.         return $this->operator(“=”,$value);
  81.     }
  82.     
  83.     function lt($value){
  84.         return $this->operator(“<“,$value);
  85.     }
  86.     
  87.     function gt($value){
  88.         return $this->operator(“>”,$value);
  89.     }
  90.     
  91.     //向字段对象加多where条件
  92.     private function operator($symbol,$value){
  93.         if($this->isVoid){
  94.             throw new \Exception(“no object field defined”);
  95.         }
  96.         $this->currentfield->addTest($symbol,$value);
  97.         return $this;                                    
    //接纳连贯语法
  98.     }
  99.     
  100.     //获取此类中持有字段对象集结的where条件数组
  101.     function getComps(){
  102.         $ret = array();
  103.         foreach($this->fields as $key => $field){
  104.             $ret = array_merge($ret,$field->getComps());
  105.         }
  106.         return $ret;
  107.     }
  108. }
    1. //客户端代码
  109. $idobj = new IdentityObject ();
  110. $idobj->field(“name”)->eq(“The Good
    Show”)->field(“start”)->gt(time())->lt(time()+(24*60*60));
  111. $test = $idobj->getComps();
  112. var_dump($test);
    1. //输出邻近上边包车型客车剧情
    1. /*
  113. array{
  114.     array(‘name’=>’name’,’operator’=>’=’,’value’=>’The
    Good Show’),
  115.    
    array(‘name’=>’start’,’operator’=>’>’,’value’=>’123456′), 
     //123456表示time()函数输出的时日戳
  116.    
    array(‘name’=>’start’,’operator’=>'<‘,’value’=>’123456’)
  117. }
    1. */
/*
标识对象模式
这个模式主要功能就是创建sql语句中的wehre条件字符串的,下面直接看代码和注释:

*/
namespace woo\mapper;


//字段对象
class Field {
    protected $name = null;          //字段名称
    protected $operator = null;         //操作符    
    protected $comps = array();         //存放条件的数组    
    protected $incomplete = false;     //检查条件数组是否有值

    function __construct ($name){
        $this->name= $name;
    }

    //添加where 条件
    function addTest($operator,$value){
        $this->comps[] = array('name'=>$this->name,'operator'=>$operator,'value'=>$value);
    }

    //获取存放条件的数组
    function getComps(){
        return $this->comps;
    }

    function isIncomplete(){
        return empty($this->comps);
    }
}


//标识对象
class IdentityObject {
    protected $currentfield = null;        //当前操作的字段对象
    protected $fields = array();        //字段集合
    private $and = null;
    private $enforce = array();            //限定的合法字段        

    function __construct($field = null, array $enforce = null){
        if(!is_null($enforce)){
            $this->enforce = $enforce;
        }
        if(!is_null($field)){
            $this->field($field);
        }
    }

    //获取限定的合法字段
    function getObjectFields(){
        return $this->enforce;
    }

    //主要功能为设置当前需要操作的对象
    function field($fieldname){
        if(!$this->isVoid()&& $this->currentfield->isIncomplete()){
            throw new \Exception("Incomplete field");
        }
        $this->enforceField($fieldname);
        if(isset($this->fields[$fieldname]){
            $this->currentfield = $this->fields[$fieldname];
        } else {
            $this->currentfield = new Field($fieldname);
            $this->fields[$fieldname] = $this->currentfield;
        }
        return $this;                    //采用连贯语法
    }

    //字段集合是否为空
    function isVoid(){
        return empty($this->fields);
    }

    //检查字段是否合法
    function enforceField ($fieldname){
        if(!in_array($fieldname,$this->enforce) && !empty($this->enforce)){
            $forcelist = implode(',',$this->enforce);
            throw new \Exception("{$fieldname} not a legal field {$forcelist}");
        }
    }


    //向字段对象添加where条件
    function eq($value){
        return $this->operator("=",$value);
    }

    function lt($value){
        return $this->operator("<",$value);
    }

    function gt($value){
        return $this->operator(">",$value);
    }

    //向字段对象添加where条件
    private function operator($symbol,$value){
        if($this->isVoid){
            throw new \Exception("no object field defined");
        }
        $this->currentfield->addTest($symbol,$value);
        return $this;                                     //采用连贯语法
    }

    //获取此类中所有字段对象集合的where条件数组
    function getComps(){
        $ret = array();
        foreach($this->fields as $key => $field){
            $ret = array_merge($ret,$field->getComps());
        }
        return $ret;
    }
}

//客户端代码
$idobj = new IdentityObject ();
$idobj->field("name")->eq("The Good Show")->field("start")->gt(time())->lt(time()+(24*60*60));
$test = $idobj->getComps();
var_dump($test);

//输出类似下面的内容

/*
array{
    array('name'=>'name','operator'=>'=','value'=>'The Good Show'),
    array('name'=>'start','operator'=>'>','value'=>'123456'),   //123456表示time()函数输出的时间戳
    array('name'=>'start','operator'=>'<','value'=>'123456')
}

*/

案例表达:

 

在此地透过变量的赋值情势 与
对象的赋值形式艺术相比较,代码第5行中的赋值情势为“拷贝赋值”,故在退换其源值的气象下,$b的值不受影响。$a与$b的内部存款和储蓄器关系图如下:

澳门威斯尼人平台登陆 1

而代码20行将数据类型赋值给$p变量,通过$p修改对象内部的值成功,比较变量的传值方式,表明那是引用传值,内部存款和储蓄器关系图如下:

澳门威斯尼人平台登陆 2

那二种最主旨的搞精通后,我们对面向对象传值情势张开深化,请看一下代码:

 1 <?php  2     class Person 3     { 4         public $name; 5         public $age; 6     } 7     // 将对象类型的数据 赋值 给一个变量 8     $p = new Person; 9     // 通过对属性修改值,来确定面向对象中 对象的传值方式10     $p->name = 'jesse';11     // 将对象赋予另一变量12     $m = $p;13     // 另一变量修改属性值14     $m->name = 'Marry';15     // 输出源变量 赋值变量访问内部属性的结果16     echo $p->name, $m->name;17 ?>

第12行代码为本篇小说的最“点睛”的代码,等号左侧为是贰个目的,侧面是贰个变量,那么犀利的主题素材来了,$m是将目的拷贝一份?还是按引用传递呢?该代码内部存款和储蓄器关系如下:

澳门威斯尼人平台登陆 3

因此,最终四个指标的属性值均被修改为Marry!!!

那按援引传值会是怎么个境况?

 1 <?php  2     class Person 3     { 4         public $name; 5         public $age; 6     } 7     // 将对象类型的数据 赋值 给一个变量 8     $p = new Person; 9     // 通过对属性修改值,来确定面向对象中 对象的传值方式10     $p->name = 'jesse';11     // 将对象赋予另一变量12     $m = &$p;13     // 另一变量修改属性值14     $m->name = 'Marry';15     // 输出源变量 赋值变量访问内部属性的结果16     echo $p->name, $m->name;17 ?>

澳门威斯尼人平台登陆 4

                                    —— Create By Jesse
2018.01.22


发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图