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 擁有大量針對多種程式語言的擴展,可以輕鬆編寫
