仓酷云

标题: PHP教程之第九节--绑定 -- Classes and Objects ... [打印本页]

作者: 若相依    时间: 2015-2-4 00:21
标题: PHP教程之第九节--绑定 -- Classes and Objects ...
因为函数实在是太多了,慢慢的你就会知道,知道有这个函数就可以。object|php5   /*
+-------------------------------------------------------------------------------+
| = 本文为Haohappy读<<Core PHP Programming>>
| = 中Classes and Objects一章的笔记
| = 翻译为主+团体心得
| = 为防止能够产生的不用要的费事请勿转载,感谢
| = 接待品评斧正,但愿和一切PHP喜好者配合前进!
+-------------------------------------------------------------------------------+
*/

第九节--绑定

除限制会见,会见体例也决意哪一个办法将被子类挪用或哪一个属性将被子类会见. 函数挪用与函数自己的联系关系,和成员会见与变量内存地址间的关系,称为绑定.

在盘算机言语中有两种次要的绑定体例―静态绑定和静态绑定. 静态绑定产生于数据布局和数据布局间,法式履行之前. 静态绑定产生于编译期, 因而不克不及使用任何运转期的信息. 它针对函数挪用与函数的主体,或变量与内存中的区块. 由于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 静态绑定
<?php
class Father
{
protected $salutation = "Hello there!"; //问候

public function getSalutation()
{
print("$this->salutationn");
$this->identify();
}

protected function identify()
{
print("I am Father.<br>n");
}
};

class Son extends Father
{
protected $salutation = "Hey!"; //父类中的protected $salutation 被覆写

protected function identify() //父类中的protected identify() 被覆写
{
print("I am Son.<br>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
<?php
class Father
{
private $salutation = "Hello there!";

public function getSalutation()
{
print("$this->salutationn");
$this->identify();
}

private function identify()
{
print("I am Father.<br>n");
}
}

class Son extends Father
{
private $salutation = "Hey!";
private function identify()
{
print("I am Son.<br>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 静态绑定的优点
<?php
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.<br>n");
return(FALSE);
}

//delete the user
print("User deleted.<br>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办法或变量,例如当你确信你不想答应子类改动父类中的某个特定的部分.  第1步环境配置好了,你算了进了1小步了,那么第2步呢 就是调出第1个程序 一般都是用hello world,视频教程里面我都做了,hello world
作者: 兰色精灵    时间: 2015-2-4 12:30
基础有没有对学习php没有太大区别,关键是兴趣。
作者: 小女巫    时间: 2015-2-26 01:34
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
作者: 仓酷云    时间: 2015-3-8 11:17
写的比较杂,因为我也是个新手,不当至于大家多多指正。
作者: 蒙在股里    时间: 2015-3-13 03:09
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
作者: 飘灵儿    时间: 2015-3-20 11:11
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
作者: 小妖女    时间: 2015-3-20 11:11
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
作者: 再见西城    时间: 2015-3-23 11:20
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
作者: 金色的骷髅    时间: 2015-3-27 08:18
刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。
作者: 飘飘悠悠    时间: 2015-4-4 23:54
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
作者: 变相怪杰    时间: 2015-4-6 21:08
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
作者: 透明    时间: 2015-4-11 07:10
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
作者: 山那边是海    时间: 2015-4-12 19:37
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
作者: 柔情似水    时间: 2015-4-26 02:12
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
作者: 乐观    时间: 2015-4-30 14:08
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
作者: 小魔女    时间: 2015-6-15 22:24
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
作者: 老尸    时间: 2015-6-23 20:23
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
作者: 第二个灵魂    时间: 2015-6-27 02:40
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
作者: 愤怒的大鸟    时间: 2015-7-6 00:45
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
作者: admin    时间: 2015-7-12 15:47
基础有没有对学习php没有太大区别,关键是兴趣。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2