除了限制访问,访问方式也决定哪个方法将被子类调用或哪个属性将被子类访问. 函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定.
在计算机语言中有两种主要的绑定方式—静态绑定和动态绑定. 静态绑定发生于数据结构和数据结构间,程序执行之前. 静态绑定发生于编译期, 因此不能利用任何运行期的信息. 它针对函数调用与函数的主体,或变量与内存中的区块. 因为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!"; file://问候
public function getSalutation()
{
print("$this->salutationn");
$this->identify();
}
protected function identify()
{
print("I am Father.
n");
}
};
class Son extends Father
{
protected $salutation = "Hey!"; file://父类中的protected $salutation 被覆写
protected function identify() file://父类中的protected identify() 被覆写
{
print("I am Son.
n");
}
};
$obj = new Son();
$obj->getSalutation(); file://输出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(); file://输出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 file://用户
{
protected function isAuthorized() file://是否是验证用户
{
return(FALSE);
}
public function getName() file://获得名字
{
return($this->name);
}
public function deleteUser($username) file://删除用户
{
if(!$this->isAuthorized())
{
print("You are not authorized.
n");
return(FALSE);
}
//delete the user
print("User deleted.
n");
}
}
class AuthorizedUser extends User file://认证用户
{
protected function isAuthorized() file://覆写isAuthorized()
{
return(TRUE);
}
}
$user = new User;
$admin = new AuthorizedUser;
//not authorized
$user->deleteUser("Zeev");
//authorized
$admin->deleteUser("Zeev");
?> 为什么private的类成员模拟静态绑定? 为了回答这个问题, 你需要回忆一下为什么需要有private成员.什么时候用它们来代替protected成员是有意义的?
private成员只有当你不想让子类继承改变或特殊化父类的行为时才用到. 这种情况比你想像的要少. 通常来说,一个好的对象分层结构应当允许绝大多数功能被子类特殊化,改进,或改变—这是面向对象编程的基础之一. 一定的情况下需要private方法或变量,例如当你确信你不想允许子类改变父类中的某个特定的部份.

两个微信不可以绑定同一张银行卡。绑定银行卡到微信账户操作:1、打开微信应用程序,点击“我”选项,然后选择“支付”选项;2、选择“添加银行卡”选项,并按照系统提示输入银行卡信息;3、一旦银行卡绑定成功,用户就可以在微信中使用该银行卡进行支付和转账。

在许多Web应用程序中,表格是必不可少的一个组件。表格通常具有大量数据,因此表格需要一些特定的功能来提高用户体验。其中一个重要的功能是可编辑性。在本文中,我们将探讨如何使用Vue.js实现可编辑的表格,并提供具体的代码示例。步骤1:准备数据首先,我们需要为表格准备数据。我们可以使用JSON对象来存储表格的数据,并将其存储在Vue实例的data属性中。在本例中

在如今这个信息爆炸的时代,个人品牌和企业形象的建设变得越来越重要。小红书作为国内领先的时尚生活分享平台,吸引了大量用户关注和参与。对于那些希望扩大影响力、提高内容传播效率的用户来说,绑定子账号成为了一种有效的手段。那么,小红书怎么绑定子账号呢?又如何检测账号是否正常呢?本文将为您详细解答这些问题。一、小红书怎么绑定子账号?1.登录主账号:首先,您需要登录您的小红书主账号。2.打开设置菜单:点击右上角的“我”,然后选择“设置”。3.进入账号管理:在设置菜单中,找到“账号管理”或“账号助手”选项,点

MetaMask(中文也叫小狐狸钱包)是一款免费的、广受好评的加密钱包软件。目前,BTCC已支持绑定MetaMask钱包,绑定后可使用MetaMask钱包进行快速登入,储值、买币等,且首次绑定还可获得20USDT体验金。在BTCCMetaMask钱包教学中,我们将详细介绍如何注册和使用MetaMask,以及如何在BTCC绑定并使用小狐狸钱包。MetaMask钱包是什么?MetaMask小狐狸钱包拥有超过3,000万用户,是当今最受欢迎的加密货币钱包之一。它可免费使用,可作为扩充功能安装在网络

1、打开今日头条。2、点击右下角我的。3、点击【系统设置】。4、点击【账号和隐私设置】。5、点击【抖音】右边的按钮即可绑定抖音。

菜鸟app就是能够为你们提供出各种物流信息状况的平台,这里的功能非常的强大好用,大家有任何与物流相关的问题,都能在这得到解决的,反正都能为你们带来一站式的服务,全都能及时解决的,查快递,取快递,寄快递等,都是毫无任何问题,与各个的平台都进行了合作,全部的信息,都能查询得到的,但是有些时候会出现拼多多当中购买的商品,都是无法呈现出物流的信息,其实是需要大家进行手动绑定拼多多,才能实现的,具体的方法已经整理出来了在下方,大家都能来看看的。菜鸟绑定拼多多账户的方法: 1、打开菜鸟APP,在主页面

你们知道在使用菜鸟裹裹的时候是怎么来绑定拼多多的吗?菜鸟裹裹App官方正版在这款平台上面对于一些拼多多的物流信息是没有自动同步上去的,我们需要做的就只能复制单号过来或者是查询你们的手机看看有无快递的信息。当然这些都是需要手动来完成的,如果你们也想了解更多的话,就和小编一起来看看吧。 菜鸟APP怎么绑定拼多多 1、打开菜鸟APP,在主页面点击左上角的“导包裹”。 2、在界面中,有很多购物网站,账号都可以绑定。 3、点击导入其他电商平台。 4、用户授权:点击拼多多转到界面

小黑盒绑定不上Steam可能是网络或软件版本问题所致。小黑盒提供包括已发售和即将发售游戏价格、电脑配置要求与评价、深度玩法解析等信息。此外,它还支持用户随时随地通过移动端查找所需信息。小黑盒无法绑定Steam怎么办1、确认网络状况请确保设备已连接至互联网。2、检查小黑盒版本请确保您使用的是最新版小黑盒软件,并尝试绑定Steam账户。3、查看Steam账户设置请登录Steam账户,查看隐私设置中是否已开启允许第三方软件绑定功能。4、联系官方客服如上述步骤仍无法解决问题,建议您联系官方客服寻求帮助。


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

드림위버 CS6
시각적 웹 개발 도구
