PHP private
写了一段时候PHP,回过头来在看PHP.感觉还是有很多地方不明白.
今天在看到private的时候遇到一个小问题, 就发个帖子请教一下大家!
<?php class Father { protected $name = 'Father'; public function getName() { return $this->name; } } class Son extends Father { protected $name = 'Son'; } $son = new Son(); echo $son->getName(); //返回的是Son
另一种情况
<?php class Father { private $name = 'Father'; public function getName() { return $this->name; } } class Son extends Father { protected $name = 'Son'; } $son = new Son(); echo $son->getName(); //返回的确实father
这里就有一个问题, php对象属性的值, 在程序运行的过程中是怎么确定的!
有什么规则,或者说是一个怎么样的访问过程!
回复内容:
写了一段时候PHP,回过头来在看PHP.感觉还是有很多地方不明白.
今天在看到private的时候遇到一个小问题, 就发个帖子请教一下大家!
<?php class Father { protected $name = 'Father'; public function getName() { return $this->name; } } class Son extends Father { protected $name = 'Son'; } $son = new Son(); echo $son->getName(); //返回的是Son
另一种情况
<?php class Father { private $name = 'Father'; public function getName() { return $this->name; } } class Son extends Father { protected $name = 'Son'; } $son = new Son(); echo $son->getName(); //返回的确实father
这里就有一个问题, php对象属性的值, 在程序运行的过程中是怎么确定的!
有什么规则,或者说是一个怎么样的访问过程!
我来说说我的看法。
getName
是一个 public
方法,那么 Son
类会继承 Father
类的这个方法,这一点没有疑问,对吧。
那么先看看第一段代码的执行思路。
Son
类实例化之后,执行 getName
方法。由于这个方法是从 Father
类继承而来的,所以实际上这个方法访问的是 Father
类的 $name
这个属性。第一段代码里 $name
是 protected
类型的,在子类中这个属性被继承下来并被改写,那么 getName
就会继续去查找子类里的这个属性。
而在第二段代码的里,$name
属性已经被定义成 private
类型,所以在子类执行 getName
方法时,会先查找父类里的 $name
属性。这时候 $name
是无法被继承的,所以就返回了父类的值。
不知道我这样描述的是否详细,能让题主理解?
以往的工程里,我写的类访问级别只到 protected
,从来不用 private
,我觉得这样更符合面向对象的思想。
你试试看这个 https://segmentfault.com/q/1010000000133607
是不是你的也有警告提示但是因为设置的原因没有显示出来呢?
按说父类声明了 private $attr的话子类可以 private $attr,但是不能 protected $attr 或者 public $attr,否则会很混乱,类似的例子 父类 protected $attr;子类 public $attr;那返回哪个。
我发现黑客新想法的最佳来源,并非是名字里有“计算机”三个字的领域,而是来自于其他的创作领域 --《黑客与画家》21页
既然已经面向对象了,那么对象
这个词也肯定也不是空穴来风,话说世界万物皆对象,也不知道当初提出面向对象的人脑子里想的是谁家的对象。这个面向对象的概念大到了保持对整个世界的同理心!!!
你看看提出面向对象的人,都有这么高的Bigger。那我们学习面向对象,也至少不应该只局限在编程里。
说道爹,就应该好好唠一唠,这个是一个拼爹的时代。
我爹在前门有套房,我爹的媳妇我叫娘,我爹外号叫光头强。
<code>class Father { private $fatherHouse = '我爹在前门的四合院,房产证上只写着爹的名字'; protected $fatherWife = "我爹的媳妇"; public $nickname = "光头强"; public function whereFatherHouse(){ echo $this->fatherHouse; } public function callFatherWife(){ echo $this->fatherWife; } }</code>
说到我啊,他们制造我的时候是这个样子
<code>class Me extends Father { protected $fatherWife = '娘'; } $me = new Me();</code>
我爹在前门有套房
<code>$me->whereFatherHouse(); </code>
我爹的媳妇我叫娘
<code>$me->callFatherWife();</code>
我的外号叫夜夜强
<code>$me->nickname = '夜夜强';</code>
共有 谁都能给你起个外号,约束不了
私有 爹的房子,你始终改不成你的,只能炫耀下。
保护 家族中的一个属性
第一个父类name被重写了,所以就只有一个name。
第二个父类name没有被重写,所以调用父类的私有属性。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

CakePHP 是 PHP 的开源框架。它的目的是使应用程序的开发、部署和维护变得更加容易。 CakePHP 基于类似 MVC 的架构,功能强大且易于掌握。模型、视图和控制器 gu

登录 CakePHP 是一项非常简单的任务。您只需使用一项功能即可。您可以记录任何后台进程(如 cronjob)的错误、异常、用户活动、用户采取的操作。在 CakePHP 中记录数据很容易。提供了 log() 函数

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写
