搜尋
首頁後端開發php教程一个关于父类方法访问子类对象中的公有属性的问题

如图所示:


回复讨论(解决方案)

private $_name = '韩'; 是父类私有属性,所以子类不能修改其值。
showName是父类方法,所以把父类的$_name = '韩'; 输出。

把private 改为 protected 或 public就可以了。

或者在Kang类重写一下showName方法。

<?phpclass Han{    public $p1 = 1;    private $_name = '韩';    public function showName(){        echo '<br>p1='.$this->p1.',_name='.$this->_name;        echo '<br>类:'.get_class($this).',方法:'.__METHOD__;    }}class Kang extends Han{    public $p1 = 10;    public $_name = '康';    public function showName(){        echo '<br>p1='.$this->p1.',_name='.$this->_name;        echo '<br>类:'.get_class($this).',方法:'.__METHOD__;    }}echo '<meta http-equiv="content-type" content="text/html; charset=utf-8">';$o = new Kang;var_dump($o);echo '<br>p1='.$o->p1.',_name='.$o->_name;$o->showName();?>

private $_name = '韩'; 是父类私有属性,所以子类不能修改其值。
showName是父类方法,所以把父类的$_name = '韩'; 输出。

把private 改为 protected 或 public就可以了。



我要的是“解释”,就是为什么这里输出的是“韩”而不是“康”?不是为了要输出这个“康”这个属性数据。
你说的这个“showName是父类方法,所以把父类的$_name = '韩'; 输出。”,略算解释,但我还是想要更深入的说法。
我知道showName是父类方法,输出的"韩“是父类的私有属性值。
我的意思是,"$o"这个对象,也就是showName中的$this,明明是有公有属性_name, 和p1,为什么在其中p1可以输出10,而_name输出的是私有的那个,而不是公有的那个?(我们可以观察到,$o也就是$this中有2个_name,一个公有,一个私有)。
明明在外面,$o->_name是可以输出”康“的,而showName中的$this也就是这个$o, 则在这里面,怎么$o->_name输出的就是”韩“了呢?

谢谢 fdipzone!

因为私有的是不可侵犯的,所以私有的属性不能被覆盖

因为私有的是不可侵犯的,所以私有的属性不能被覆盖


我明白该父类的属性并没有被覆盖。倒是引出了另一个问题,那就是,我们var_dump($o),可以看到有2个_name属性,一个私有,一个公有,则该私有的该如何看待的问题。因为按通常说法,私有属性是不能继承的,则子类中定义的_name作为公有属性,并没有覆盖父类的同名属性。相反,应该看作是子类的”全新属性“。则在子类对象$o中看到的这个私有$_name,该做如何解释呢?

不过我的困惑仍然是这样:$o->_name作为公有的属性明明是可以直接访问的(输出”康“),但在其继承下来的方法showName中,$this->_name为什么就不是这个公有的_name,而是私有的_name呢?这里,我代码中给出的$o和$this毫无疑问肯定是“同一对象”。

明明在外面,$o->_name是可以输出”康“的,而showName中的$this也就是这个$o, 则在这里面,怎么$o->_name输出的就是”韩“了呢?

showName是父类的方法,所以是调用父类的属性_name。
而$o->_name是调用子类对象的_name属性,所以会读取Kang的_name

而把private $_name改为 public $_name;,则子类实例化时,会用子类的_name覆盖父类的_name,即父类的_name等于子类的_name。

而在Kang中添加showName,这样会覆盖父类的showName方法,显示的就是子类的_name。

var_dump 反映的是 kang 的内部情况,自然私有属性也是会展示出来

showName 方法是 Han 定义的,他的 $this 自然是 Han,由于私有属性 _name 没有被覆盖所以能被他访问到
而外部只能访问到 Kang 定义的公有属性 _name

如果你在 Kang 中也定义一个 showName 那么 私有属性 _name 在 Kang 中就访问不到了

var_dump 反映的是 kang 的内部情况,自然私有属性也是会展示出来

showName 方法是 Han 定义的,他的 $this 自然是 Han,由于私有属性 _name 没有被覆盖所以能被他访问到
而外部只能访问到 Kang 定义的公有属性 _name

如果你在 Kang 中也定义一个 showName 那么 私有属性 _name 在 Kang 中就访问不到了



其他的我都能认可,能理解,但关于这一句“showName 方法是 Han 定义的,他的 $this 自然是 Han”,我实际测试其实是,$this和$o是“全等”的,实际上就是一个对象($o)。
另外,从var_dump($o)看到的对象$o的内部情况,确实可以看到它有两个_name属性,一个是公有的,一个是私有的。或者,理论上,在showName中,这两个其实都能访问到。比如,把Han类中的私有属性_name注释掉,就可以访问其子类的公有的_name属性了。
实际上,我的问题,就在这里:为什么这里输出的是私有的那个_name,而不是共有的那个_name。
我想要知道的是一个理论上的解释,或原理上的解释,至于现象,或单纯的解释为“因为showName是Han类定义的,所以Han类中的私有属性可以被其访问到”,我是知道的。
这里可以肯定的是,$o对象有两个_name属性,一个来自Han类的私有,一个来自Kang类的公有,showName()方法对这两个都可以访问到。我想到的一个可能的解释是:方法优先访问其所在类中定义的”同属一类“的属性。但实际上,这个解释是我想象出来的,我没有在哪里见过。所以,我就想要知道,一个更深入的有关此现象的解释。
ok?谢谢各位!

你把 echo '
类:'.get_class($this).',方法:'.__METHOD__;
改成 echo '
类:'. __CLASS__ .',方法:'.__METHOD__;
就可以从结果中看出了

p1=10,_name=康
p1=10,_name=韩
类: Han,方法:Han::showName

虽然 Kong 了继承了 Han 的方法 showName (__METHOD__ 为 Han::showName)
但他依然工作在 Han 类中,那么 $this->_name 就是 Han::_name 并且永远都是
如果 Han::_name 不是私有的,那么 Kong::_name 将会覆盖 Han::_name
但并不是说 $this->_name 访问的是 Kong::_name,而实际上依然是 Han::_name,只不过两个的值相同而已

嗯,9楼xuzuning版主这次的解释已经接近我想要的了,hoho。

我再就细节探讨探讨。

你让我把get_class($this),替换成__CLASS__,然后得到的是”Han”这个类名。但这只能说明showName方法所在类,因为__CLASS__永远指的是其所在方法的所属类。而并不能说明在showName方法中,$this->_name为什么是"韩",而不是“康”。而且,在这里,$this它就是“kang”类对象??不过我突然想到,它确实也是“Han”类对象,因为Kang是Han的子类,子类对象自然一定是父类的对象。由此解释的话,则$this->_name确实是应该输出Han::_name的值了。
不过你后面的解释,showName方法“依然工作在 Han 类中,那么 $this->_name 就是 Han::_name 并且永远都是”,是否过于绝对呢?比如,如果Han中没有_name这个属性,则$this->_name不就访问了Kang类对象$o(也就是这里的$this)的_name了么。但你后面的解释说,如果Han::_name不是私有的,则会被子类覆盖,然后此时访问的$this->_name将仍然是Han::_name,对我来说倒是挺新鲜的,受益匪浅。

如果Han::_name不是私有的,则会被子类覆盖,然后此时访问的$this->_name将仍然是Han::_name,是这样的。
是两个类的值,只是如果不是私有,父类的值与子类一样。

如果父类有私有的属性,那么父类的方法只为父类的私有属性服务。 

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
11個最佳PHP URL縮短腳本(免費和高級)11個最佳PHP URL縮短腳本(免費和高級)Mar 03, 2025 am 10:49 AM

長URL(通常用關鍵字和跟踪參數都混亂)可以阻止訪問者。 URL縮短腳本提供了解決方案,創建了簡潔的鏈接,非常適合社交媒體和其他平台。 這些腳本對於單個網站很有價值

在Laravel中使用Flash會話數據在Laravel中使用Flash會話數據Mar 12, 2025 pm 05:08 PM

Laravel使用其直觀的閃存方法簡化了處理臨時會話數據。這非常適合在您的應用程序中顯示簡短的消息,警報或通知。 默認情況下,數據僅針對後續請求: $請求 -

構建具有Laravel後端的React應用程序:第2部分,React構建具有Laravel後端的React應用程序:第2部分,ReactMar 04, 2025 am 09:33 AM

這是有關用Laravel後端構建React應用程序的系列的第二個也是最後一部分。在該系列的第一部分中,我們使用Laravel為基本的產品上市應用程序創建了一個RESTFUL API。在本教程中,我們將成為開發人員

簡化的HTTP響應在Laravel測試中模擬了簡化的HTTP響應在Laravel測試中模擬了Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显著减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

php中的捲曲:如何在REST API中使用PHP捲曲擴展php中的捲曲:如何在REST API中使用PHP捲曲擴展Mar 14, 2025 am 11:42 AM

PHP客戶端URL(curl)擴展是開發人員的強大工具,可以與遠程服務器和REST API無縫交互。通過利用Libcurl(備受尊敬的多協議文件傳輸庫),PHP curl促進了有效的執行

在Codecanyon上的12個最佳PHP聊天腳本在Codecanyon上的12個最佳PHP聊天腳本Mar 13, 2025 pm 12:08 PM

您是否想為客戶最緊迫的問題提供實時的即時解決方案? 實時聊天使您可以與客戶進行實時對話,並立即解決他們的問題。它允許您為您的自定義提供更快的服務

宣布 2025 年 PHP 形勢調查宣布 2025 年 PHP 形勢調查Mar 03, 2025 pm 04:20 PM

2025年的PHP景觀調查調查了當前的PHP發展趨勢。 它探討了框架用法,部署方法和挑戰,旨在為開發人員和企業提供見解。 該調查預計現代PHP Versio的增長

Laravel中的通知Laravel中的通知Mar 04, 2025 am 09:22 AM

在本文中,我們將在Laravel Web框架中探索通知系統。 Laravel中的通知系統使您可以通過不同渠道向用戶發送通知。今天,我們將討論您如何發送通知OV

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境