电脑安全

您当前的位置:主页 > 电脑安全 >

PHP 5.0对象模型深度探索之绑定-网络编程

来源:[db:来源]标题:   绑定    编辑:电脑技术全能网 时间:2019-09-22 18:27

原标题:PHP 5.0对象模型深度探索之绑定-网络编程
   除了限度拜访,拜访方法也决议哪个方式将被子类挪用或哪个属性将被子类拜访. 函数挪用与函数自身的关系,以及成员拜访与变量内存地点间的关联,称为绑定。  在盘算机言语中有两种重要的绑定方法―动态绑定和静态绑定。动态绑定产生于数据构造和数据构造间,顺序履行之前. 动态绑定产生于编译期, 因而不能应用任何运转期的信息。它针对函数挪用与函数的主体,或变量与内存中的区块。由于PHP是一种静态言语,它不应用动态绑定。然而能够模仿动态绑定。  静态绑定章针对运转期发生的拜访恳求,只用到运转期的可用信息。在面向工具的代码中,静态绑定象征着决议哪个方式被挪用或哪个属性被拜访,将基于这个类自身而不基于拜访范畴。  Public和protected成员的举措相似于PHP的前几个版本中函数的举措,应用静态绑定。这象征着假如一个方式拜访一个在子类中被覆写的类成员,并是一个子类的实例,子类的成员将被拜访(而不是拜访父类中的成员)。  看例子6.10. 这段代码输入” Hey! I am Son.” 由于当PHP挪用getSalutation, 是一个Son的实例,是将Father中的salutation覆写而来. 假如salutation是public的,PHP将发生雷同的成果. 覆写方式的操纵很相似。在Son中,关于identify的挪用绑定到谁人方式。  即便在子类中拜访方法被从protected减弱成public, 静态绑定依然会产生. 依照拜访方法应用的准则,加强关于类成员的拜访限度是弗成能的,以是把拜访方法从public转变成protected弗成能停止。  Listing 6.10 Dynamic binding 静态绑定  class Father   {   protected $salutation = "Hello there!"; //问候   public function getSalutation()   {   print("$this->salutationn");   $this->identify();   }   protected function identify()   {   print("I am Father.  n");   }   };   class Son extends Father   {   protected $salutation = "Hey!"; //父类中的protected $salutation 被覆写   protected function identify() //父类中的protected identify() 被覆写   {   print("I am Son.  n");   }   };   $obj = new Son();   $obj->getSalutation(); //输入Hey! I am Son.   ?>   //注: 在子类中没有覆写getSalutation(),但现实上依然存在一个getSalutation().这个类中的$salutation和identify()  //与Son子类的实例中的getSalutation()方式静态绑定,以是挪用Son的实例的getSalutation()方式,  //将挪用Son类中的成员salutation及identify(),而不是父类中的成员salutation及identify().   Private成员只存在于它们地点的类外部. 不像public和protected成员那样,PHP模仿动态绑定. 看例子6.11。它输入”Hello there! I am Father.”,只管子类覆写了salutation的值,剧本将this->salutation和以后类Father绑定. 相似的准则利用于private方式identify()。  Listing 6.11 Binding and private members  class Father   {   private $salutation = "Hello there!";   public function getSalutation()   {   print("$this->salutationn");   $this->identify();   }   private function identify()   {   print("I am Father.  n");   }   }   class Son extends Father   {   private $salutation = "Hey!";   private function identify()   {   print("I am Son.  n");   }   }   $obj = new Son();   $obj->getSalutation(); //输入Hello there! I am Father.   ?>   静态绑定的利益是同意继续类来转变父类的行动,同时能够坚持父类的接口和功效,看例子6.12. 因为应用了静态绑定,在deleteUser中被挪用的isAuthorized的version 能够由工具的范例来断定。假如是一个一般的user,PHP挪用User::isAuthorized会前往FALSE.假如是一个AuthorizedUser的实例,PHP挪用AuthorizedUser::isAuthorized,将同意deleteUser顺遂履行。  //haohappy注:用一句话说清晰,就是工具范例与方式,属性绑定. 挪用一个父类与子类中都存在的方式或拜访一个属性时,会先推断实例属于哪类工具范例,再挪用响应的类中的方式和属性.  Listing 6.12 静态绑定的利益   class User //用户   {   protected function isAuthorized() //能否是考证用户   {   return(FALSE);   }   public function getName() //取得名字   {   return($this->name);   }   public function deleteUser($username) //删除用户   {   if(!$this->isAuthorized())   {   print("You are not authorized.  n");   return(FALSE);   }   //delete the user   print("User deleted.  n");   }   }   class AuthorizedUser extends User //认证用户   {   protected function isAuthorized() //覆写isAuthorized()   {   return(TRUE);   }   }   $user = new User;   $admin = new AuthorizedUser;   //not authorized   $user->deleteUser("Zeev");   //authorized   $admin->deleteUser("Zeev");   ?>   为甚么private的类成员模仿动态绑定? 为了答复这个成绩, 你须要回想一下为甚么须要有private成员.甚么时间用它们来取代protected成员是故意义的?  private成员只要当你不想让子类继续转变或特别化父类的行动时才用到,这类情形比你想像的要少, 平日来讲,一个好的工具分层构造应该同意绝大少数功效被子类特别化,改良,或转变―这是面向工具编程的基本之一。必定的情形下须要private方式或变量,比方当你确信你不想同意子类转变父类中的某个特定的部分。

上一篇:PHP检验URL是否正确-网络编程

下一篇:没有了