热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php面向对象中构造析构封装性

构造函数的声明与其它操作的声明一样,只是其名称必须是__construct(),封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节

构造函数的声明与其它操作的声明一样,只是其名称必须是__construct( ),封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节

构造方法与析构方法

构造方法:

大多数类都有一种称为构造函数的特殊方法.当创建一个对象时,它将自动调用构造函数,也就是使用new这个关键字来实例化对象的时候自动调用构造方法.

构造函数的声明与其它操作的声明一样,只是其名称必须是__construct( ).这是PHP5中的变化,以前的版本中,构造函数的名称必须与类名相同,这种在PHP5中仍然可以用,但现在以经很少有人用了,这样做的好处是可以使构造函数独立于类名,当类名发生改变时不需要改相应的构造函数名称了.为了向下兼容,如果一个类中没有名为__construct( )的方法,PHP将搜索一个php4中的写法,与类名相同名的构造方法.

格式:function __construct ( [参数] ) { ... ... }

在一个类中只能声明一个构造方法,而是只有在每次创建对象的时候都会去调用一次构造方法,不能主动的调用这个方法,所以通常用它执行一些有用的初始化任务.比如对成属性在创建对象的时候赋初值.

实例代码如下:

  1. //创建一个人类    
  2. class Person    
  3. {    
  4.     //下面是人的成员属性    
  5.     var $name;  //人的名子    
  6.     var $sex;    //人的性别    
  7.     var $age;    //人的年龄    
  8.    
  9.     //定义一个构造方法参数为姓名$name、性别$sex和年龄$age    
  10.     function __construct($name$sex$age)    
  11.     {    
  12.         //通过构造方法传进来的$name给成员属性$this->name赋初使值    
  13.         $this->name=$name;    
  14.         //通过构造方法传进来的$sex给成员属性$this->sex赋初使值    
  15.         $this->sex=$sex;    
  16.         //通过构造方法传进来的$age给成员属性$this->age赋初使值    
  17.         $this->age=$age;    
  18.     }    
  19.    
  20.     //这个人的说话方法    
  21.     function say()    
  22.     {    
  23.         echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."";    
  24.     }    
  25. }    
  26.    
  27. //通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄    
  28. $p1=new Person("张三","男", 20);    
  29. $p2=new Person("李四","女", 30);    
  30. $p3=new Person("王五","男", 40);    
  31.    
  32. //下面访问$p1对象中的说话方法    
  33. $p1->say();    
  34. //下面访问$p2对象中的说话方法    
  35. $p2->say();    
  36. //下面访问$p3对象中的说话方法    
  37. $p3->say();    

输出结果为:   

我的名子叫:张三 性别:男 我的年龄是:20   

我的名子叫:李四 性别:女 我的年龄是:30   

我的名子叫:王五 性别:男 我的年龄是:40 

  1. //创建一个人类 
  2. class Person 
  3.     //下面是人的成员属性 
  4.     var $name;  //人的名子 
  5.     var $sex;    //人的性别 
  6.     var $age;    //人的年龄 
  7.     //定义一个构造方法参数为姓名$name、性别$sex和年龄$age 
  8.     function __construct($name$sex$age
  9.     { 
  10.         //通过构造方法传进来的$name给成员属性$this->name赋初使值 
  11.         $this->name=$name
  12.         //通过构造方法传进来的$sex给成员属性$this->sex赋初使值 
  13.         $this->sex=$sex
  14.         //通过构造方法传进来的$age给成员属性$this->age赋初使值 
  15.         $this->age=$age
  16.     } 
  17.     //这个人的说话方法 
  18.     function say() 
  19.     { 
  20.         echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age.""
  21.     } 
  22. //通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄 
  23. $p1=new Person("张三","男", 20); 
  24. $p2=new Person("李四","女", 30); 
  25. $p3=new Person("王五","男", 40); 
  26. //下面访问$p1对象中的说话方法 
  27. $p1->say(); 
  28. //下面访问$p2对象中的说话方法 
  29. $p2->say(); 
  30. //下面访问$p3对象中的说话方法 
  31. $p3->say(); 

输出结果为:

我的名子叫:张三 性别:男 我的年龄是:20

我的名子叫:李四 性别:女 我的年龄是:30

我的名子叫:王五 性别:男 我的年龄是:40

析构函数:

与构造函数相对的就是析构函数.析构函数是PHP5新添加的内容,在PHP4中没有析构函数.析构函数允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件, 释放结果集等,析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行,也就是对象在内存中被销毁前调用析构函数.与构造函数的名称类似,一个类的析构函数名称必须是__destruct( ).析构函数不能带有任何参数.

格式:function __destruct ( ) { ... ... }

实例代码如下:

  1. //创建一个人类    
  2. class Person    
  3. {    
  4.     //下面是人的成员属性    
  5.     var $name;  //人的名子    
  6.     var $sex;    //人的性别    
  7.     var $age;    //人的年龄    
  8.    
  9.     //定义一个构造方法参数为姓名$name、性别$sex和年龄$age    
  10.     function __construct($name$sex$age)    
  11.     {    
  12.         //通过构造方法传进来的$name给成员属性$this->name赋初使值    
  13.         $this->name=$name;    
  14.         //通过构造方法传进来的$sex给成员属性$this->sex赋初使值    
  15.         $this->sex=$sex;    
  16.         //通过构造方法传进来的$age给成员属性$this->age赋初使值    
  17.         $this->age=$age;    
  18.     }    
  19.    
  20.     //这个人的说话方法    
  21.     function say()    
  22.     {    
  23.         echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."";    
  24.     }           
  25.    
  26.     //这是一个析构函数,在对象销毁前调用    
  27.     function __destruct()    
  28.     {    
  29.         echo "再见".$this->name."";    
  30.     }    
  31. }    
  32.    
  33. //通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄    
  34. $p1=new Person("张三","男", 20);    
  35. $p2=new Person("李四","女", 30);    
  36. $p3=new Person("王五","男", 40);    
  37.    
  38. //下面访问$p1对象中的说话方法    
  39. $p1->say();    
  40. //下面访问$p2对象中的说话方法    
  41. $p2->say();    
  42. //下面访问$p3对象中的说话方法    
  43. $p3->say();    
  44.    

输出结果为:   

我的名子叫:张三 性别:男 我的年龄是:20   

我的名子叫:李四 性别:女 我的年龄是:30   

我的名子叫:王五 性别:男 我的年龄是:40   

再见张三   

再见李四   

再见王五 

封装性

封装性是面象对象编程中的三大特性之一,封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义:1.把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象).2.信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界〔或者说形成一道屏障〕,只保留有限的对外接口使之与外部发生联系.

封装的原则在软件上的反映是:要求使对象以外的部分不能随意存取对象的内部数据(属性),从而有效的避免了外部错误对它的"交叉感染",使软件错误能够局部化,大大减少查错和排错的难度.

用个实例来说明吧, 假如某个人的对象中有年龄和工资等属性,像这样个人隐私的属性是不想让其它人随意就能获得到的,如果你不使用封装,那么别人想知道就能得到,但是如果你封装上之后别人就没有办法获得封装的属性, 除非你自己把它说出去,否则别人没有办法得到.在比如说,个人电脑都有一个密码,不想让其它人随意的登陆,在你电脑里面拷贝和粘贴.还有就是像人这个对象, 身高和年龄的属性, 只能是自己来增涨,不可以让别人随意的赋值等等.

实例代码如下:

  1. //使用private这个关键字来对属性和方法进行封装:    
  2. //原来的成员:    
  3. var $name;          //声明人的姓名    
  4. var $sex;           //声明人的性别    
  5. var $age;           //声明人的年龄    
  6. function run(){…….}    
  7.    
  8. //改成封装的形式:    
  9. private $name;          //把人的姓名使用private关键字进行封装    
  10. private $sex;           //把人的性别使用private关键字进行封装    
  11. private $age;           //把人的年龄使用private关键字进行封装    
  12. private function run(){……}  //把人的走路方法使用private关键字进行封装  
  13. //使用private这个关键字来对属性和方法进行封装: 
  14. //原来的成员: 
  15. var $name;   //声明人的姓名 
  16. var $sex;   //声明人的性别 
  17. var $age;   //声明人的年龄 
  18. function run(){…….} 
  19. //改成封装的形式: 
  20. private $name;    //把人的姓名使用private关键字进行封装 
  21. private $sex;   //把人的性别使用private关键字进行封装 
  22. private $age;   //把人的年龄使用private关键字进行封装 

private function run(){……} //把人的走路方法使用private关键字进行封装注意:只要是成员属性前面有其它的关键字就要去掉原有的关键字”var”. 通过private就可以把人的成员(成员属性和成员方法)封装上了.封装上的成员就不能被类外面直接访问了,只有对象内部自己可以访问;下面的代码会产生错误:

  1. class Person    
  2. {    
  3.     //下面是人的成员属性    
  4.     private $name;  //人的名子,被private封装上了    
  5.     private $sex;    //人的性别, 被private封装上了    
  6.     private $age;    //人的年龄, 被private封装上了    
  7.    
  8.     //这个人可以说话的方法    
  9.     function say()    
  10.     {    
  11.         echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."";    
  12.     }           
  13.    
  14.     //这个人可以走路的方法, 被private封装上了    
  15.     private function run()    
  16.     {    
  17.         echo "这个人在走路";    
  18.     }    
  19. }    
  20. //实例化一个人的实例对象    
  21. $p1=new Person();    
  22.    
  23. //试图去给私有的属性赋值, 结果会发生错误    
  24. $p1->name="张三";    
  25. $p1->sex="男";    
  26. $p1->age=20;    
  27.    
  28. //试图去打印私有的属性, 结果会发生错误    
  29. echo $p1->name."";    
  30. echo $p1->sex."";    
  31. echo $p1->age.""   
  32.    
  33. //试图去打印私有的成员方法, 结果会发生错误    
  34. $p1->run();    

输出结果为:   

  1. Fatal error: Cannot access private property Person::$name   
  2.  
  3. Fatal error: Cannot access private property Person::$sex   
  4.  
  5. Fatal error: Cannot access private property Person::$age   
  6.  
  7. Fatal error: Cannot access private property Person::$name   
  8.  
  9. Fatal error: Call to private method Person::run() from context ''  
  10.  
  11. class Person 
  12.  
  13.     //下面是人的成员属性 
  14.     private $name;  //人的名子,被private封装上了 
  15.     private $sex;    //人的性别, 被private封装上了 
  16.     private $age;    //人的年龄, 被private封装上了 
  17.     //这个人可以说话的方法 
  18.     function say() 
  19.     { 
  20.         echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age.""
  21.     }   
  22.     //这个人可以走路的方法, 被private封装上了 
  23.     private function run() 
  24.     { 
  25.         echo "这个人在走路"
  26.     } 
  27. //实例化一个人的实例对象 
  28. $p1=new Person(); 
  29. //试图去给私有的属性赋值, 结果会发生错误 
  30. $p1->name="张三"
  31. $p1->sex="男"
  32. $p1->age=20; 
  33. //试图去打印私有的属性, 结果会发生错误 
  34. echo $p1->name.""
  35. echo $p1->sex.""
  36. echo $p1->age."" 
  37. //试图去打印私有的成员方法, 结果会发生错误 
  38. $p1->run(); 
  39. 输出结果为: 
  40. Fatal error: Cannot access private property Person::$name 
  41. Fatal error: Cannot access private property Person::$sex 
  42. Fatal error: Cannot access private property Person::$age 
  43. Fatal error: Cannot access private property Person::$name 
  44. Fatal error: Call to private method Person::run() from context '' 

从上面的实例可以看到, 私有的成员是不能被外部访问的, 因为私有成员只能在本对象内部自己访问,比如,$p1这个对象自己想把他的私有属性说出去,在say()这个方法里面访问了私有属性,这样是可以.(没有加任何访问控制,默认的是public的,任何地方都可以访问)

//这个人可以说话的方法, 说出自己的私有属性,在这里也可以访问私有方法  

实例代码如下:

  1. function say()    
  2. {    
  3.     echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."   
  4. ";    
  5.     //在这里也可以访问私有方法    
  6.     //$this->run();    
  7. }  
  8. //这个人可以说话的方法, 说出自己的私有属性,在这里也可以访问私有方法 
  9. function say() 
  10.  echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age." 
  11. "; 
  12.  //在这里也可以访问私有方法 
  13.  //$this->run(); 

因为成员方法say()是公有的, 所以我们在类的外部调用say()方法是可以的,改变上面的代码;

  1. class Person    
  2. {    
  3.     //下面是人的成员属性    
  4.     private $name;  //人的名子,被private封装上了    
  5.     private $sex;    //人的性别, 被private封装上了    
  6.     private $age;    //人的年龄, 被private封装上了    
  7.    
  8.     //定义一个构造方法参数为私有的属性姓名$name、性别$sex和年龄$age进行赋值   
  9.     function __construct($name$sex$age)    
  10.     {    
  11.         //通过构造方法传进来的$name给私有成员属性$this->name赋初使值    
  12.         $this->name=$name;    
  13.         //通过构造方法传进来的$sex给私有成员属性$this->sex赋初使值    
  14.         $this->sex=$sex;    
  15.         //通过构造方法传进来的$age给私有成员属性$this->age赋初使值    
  16.         $this->age=$age;    
  17.     }    
  18.    
  19.     //这个人可以说话的方法, 说出自己的私有属性,在这里也可以访问私有方法    
  20.     function say()    
  21.     {    
  22.         echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."   
  23. ";    
  24.     }    
  25. }    
  26.    
  27. //通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄    
  28. $p1=new Person("张三","男", 20);    
  29. $p2=new Person("李四","女", 30);    
  30. $p3=new Person("王五","男", 40);    
  31.    
  32. //下面访问$p1对象中的说话方法    
  33. $p1->say();    
  34. //下面访问$p2对象中的说话方法    
  35. $p2->say();    
  36. //下面访问$p3对象中的说话方法    
  37. $p3->say();    
  38.    
  39. 输出结果为:    
  40. 我的名子叫:张三 性别:男 我的年龄是:20    
  41. 我的名子叫:李四 性别:女 我的年龄是:30    
  42. 我的名子叫:王五 性别:男 我的年龄是:40  
  43. class Person 
  44.     //下面是人的成员属性 
  45.     private $name;  //人的名子,被private封装上了 
  46.     private $sex;    //人的性别, 被private封装上了 
  47.     private $age;    //人的年龄, 被private封装上了 
  48.     //定义一个构造方法参数为私有的属性姓名$name、性别$sex和年龄$age进行赋值 
  49.     function __construct($name$sex$age
  50.     { 
  51.         //通过构造方法传进来的$name给私有成员属性$this->name赋初使值 
  52.         $this->name=$name
  53.         //通过构造方法传进来的$sex给私有成员属性$this->sex赋初使值 
  54.         $this->sex=$sex
  55.         //通过构造方法传进来的$age给私有成员属性$this->age赋初使值 
  56.         $this->age=$age
  57.     } 
  58.     //这个人可以说话的方法, 说出自己的私有属性,在这里也可以访问私有方法 
  59.     function say() 
  60.     { 
  61.         echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age." 
  62. "; 
  63.     } 
  64. //通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄 
  65. $p1=new Person("张三","男", 20); 
  66. $p2=new Person("李四","女", 30); 
  67. $p3=new Person("王五","男", 40); 
  68. //下面访问$p1对象中的说话方法 
  69. $p1->say(); 
  70. //下面访问$p2对象中的说话方法 
  71. $p2->say(); 
  72. //下面访问$p3对象中的说话方法 
  73. $p3->say(); 

输出结果为:

我的名子叫:张三 性别:男 我的年龄是:20

我的名子叫:李四 性别:女 我的年龄是:30

我的名子叫:王五 性别:男 我的年龄是:40因为构造方法是默认的公有方法(构造方法不要设置成私有的),所以在类的外面可以访问到,这样就可以使用构造方法创建对象, 另外构造方法也是类里面的函数,所以可以用构造方法给私有的属性赋初值.Say()的方法是默认公有的, 所以在外面也可以访问的到, 说出他自己的私有属性.

从上面的例子中我们可以看到, 私有的成员只能在类的内部使用, 不能被类外部直接来存取, 但是在类的内部是有权限访问的, 所以有时候我们需要在类的外面给私有属性赋值和读取出来,也就是给类的外部提供一些可以存取的接口,上例中构造方法就是一种赋值的形式, 但是构造方法只是在创建对象的时候赋值,如果我们已经有一个存在的对象了,想对这个存在的对象赋值, 这个时候,如果你还使用构造方法传值的形式传值, 那么就创建了一个新的对象,并不是这个已存在的对象了.所以我们要对私有的属性做一些可以被外部存取的接口,目的就是可以在对象存在的情况下,改变和存取属性的值,但要注意,只有需要让外部改变的属性才这样做,不想让外面访问的属性是不做这样的接口的,这样就能达到封装的目的,所有的功能都是对象自己来完成,给外面提供尽量少的操作.

如果给类外部提供接口,可以为私有属性在类外部提供设置方法和获取方法,来操作私有属性.例如:

实例代码如下:

  1. //私有的属性年龄    
  2. prvate $age;    
  3.    
  4. //为外部提供一个公有设置年龄的方法    
  5. function setAge($age)    
  6. {    
  7.     //在给属性赋值的时候,为了避免非法值设置给属性    
  8.     if($age<0 || $age>130)    
  9.         return;    
  10.     $this->age=$age;    
  11. }    
  12.    
  13. //为外部提供一个公有获取年龄的方法    
  14. function getAge()    
  15. {    
  16.     return($this->age);    
  17. }  
  18. //私有的属性年龄 
  19. prvate $age
  20. //为外部提供一个公有设置年龄的方法 
  21. function setAge($age
  22.  //在给属性赋值的时候,为了避免非法值设置给属性 
  23.  if($age<0 || $age>130) 
  24.   return
  25.  $this->age=$age
  26. //为外部提供一个公有获取年龄的方法 
  27. function getAge() 
  28.  return($this->age); 

上面的方法是为一个成员属性设置和获取值, 当然你也可以为每个属性用同样的方法对其进行赋值和取值的操作,完成在类外部的存取工作.


推荐阅读
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 解决TensorFlow CPU版本安装中的依赖问题
    本文记录了在安装CPU版本的TensorFlow过程中遇到的依赖问题及解决方案,特别是numpy版本不匹配和动态链接库(DLL)错误。通过详细的步骤说明和专业建议,帮助读者顺利安装并使用TensorFlow。 ... [详细]
  • 卫青与汉武帝的君臣关系及家族命运
    本文探讨了卫青与汉武帝之间的特殊关系,以及卫青去世后其家族的命运。卫青不仅是汉武帝的重要将领,还通过婚姻关系成为皇亲国戚。然而,卫青去世后,其家族并未立即遭到灭顶之灾,而是逐渐因政治风波受到牵连。 ... [详细]
  • 如何在AE中创建裂变式加载动画
    本文将详细介绍如何使用Adobe After Effects (AE) 制作一个裂变式加载动画。通过简单的步骤,您可以轻松创建出引人注目的转圈式加载效果。 ... [详细]
  • 本文详细介绍了如何在PHP中进行数组删除、清空等操作,并提供了在Visual Studio Code中创建PHP文件的步骤。 ... [详细]
  • 探索新一代API文档工具,告别Swagger的繁琐
    对于后端开发者而言,编写和维护API文档既繁琐又不可或缺。本文将介绍一款全新的API文档工具,帮助团队更高效地协作,简化API文档生成流程。 ... [详细]
  • 实现自定义组件的多值v-model双向绑定
    探讨如何在自定义组件中实现多个输入框与父组件数据的动态双向绑定,确保组件内部多个值的变化能实时反映到父组件的数据中。 ... [详细]
  • 本文深入解析宋代诗人苏轼的《催试官考较戏作》,探讨其诗中的意境、意象及艺术特色,同时提供详细的译文,帮助读者更好地理解这首经典之作。 ... [详细]
  • 本文详细介绍了在不同操作系统中查找和设置网卡的方法,涵盖了Windows系统的具体步骤,并提供了关于网卡位置、无线网络设置及常见问题的解答。 ... [详细]
  • 使用Nginx反向代理实现多域名端口映射
    本文介绍如何通过配置本地hosts文件和Nginx反向代理,实现多个虚拟域名的端口映射,使用户可以通过标准HTTP端口80访问不同后端服务。 ... [详细]
  • 本文探讨了在构建应用程序时,如何对不同类型的数据进行结构化设计。主要分为三类:全局配置、用户个人设置和用户关系链。每种类型的数据都有其独特的用途和应用场景,合理规划这些数据结构有助于提升用户体验和系统的可维护性。 ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • Linux中的yum安装软件
    yum俗称大黄狗作用:解决安装软件包的依赖关系当安装依赖关系的软件包时,会将依赖的软件包一起安装。本地yum:需要yum源,光驱挂载。yum源:(刚开始查看yum源中的内容就是上图 ... [详细]
  • 本文探讨了如何解决PHP文件无法写入本地文件的问题,并解释了PHP文件中HTML代码无效的原因,提供了一系列实用的解决方案和最佳实践。 ... [详细]
  • 鼠标悬停出现提示信息怎么做
    概述–提示:指启示,提起注意或给予提醒和解释。在excel中会经常用到给某个格子增加提醒信息,比如金额提示输入数值或最大长度值等等。设置方式也有多种,简单的,仅为单元格插入批注就可 ... [详细]
author-avatar
胡同里带小猪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有