PHPでのメンバーの権限について混乱しています
質問: 次のコードがあります:
class Far
{
protected $arr;
protected function init() {
foreach ($this->arr as $k => $val) {
$this->$k = $val; 。 set($name, $val) {
$ this->$name = $val; }
}
class Son extends Far
{
protected $a;
public function __construct() {
$this->arr =array(
& gt; '1',
);
親 :: __ が構築されました
}}
;
print_r ($ obj); a は 1 ではありませんが、null です。
Son オブジェクト
(
[a:protected] => 1
[arr:protected] => 配列
(
) [a] => 1
)
)
質問 2: 上記のコードのサブクラスのプライベート $a を protected $a または public $a に変更すると、出力は次のようになります:
Son Object
(
[a :保護されている] => 1
[arr:保護されている] = >
ディスカッションへの返信 (解決策)
何を言っているのかわかりませんか?
印刷結果は正しくありませんか?
訂正、プライベート時の出力結果は以下の通りです:
Son Object( [a:Son:private] => [arr:protected] => Array ( [a] => 1 ) [bb] => 1)
Son::a is private, far::init can access it
Son::a is private, far::init can access it しない'彼は __set マジック メソッドを持っていますか?
__setは遠くないですか?__setは遠くないですか?
$Son->bb = 1;
Son が Far の __set を取得したことが証明できます
はい、メソッドは継承ですが、権限は継承によって変更されません
私の妻はあなたのものです、という意味ではありませんあなたは私の父親です、触れることができます
はい、メソッドは継承されていますが、継承によって権限は変更されていません
私の妻はあなたのものです、それは私が触れることができるという意味ではありません
はい、それでは $ __set の this は指されていません。現在のインスタンス オブジェクトは Son のインスタンスです。 __set の機能は、プライベートまたは存在しないメンバーにアクセスすることです
コードが不完全です 長い間見てみたところ、$bb が見つかりました。
コードが不完全です。長い間見ても、$bb さえ見えません。
申し訳ありませんが、$bb は次のように私によって外部的に追加されました:
$obj = new Son();$obj->bb = 1;print_r($obj);
private はプライベート プロパティであり、それ自体で内部的にのみ呼び出すことができ、インスタンスから呼び出すことはできません。
もちろん、Far に値を割り当てることはできませんが、これは正常です。
private はプライベート属性であり、インスタンスからではなく、内部的にのみ呼び出すことができます。
もちろん、Far に値を割り当てることはできませんが、これは正常です。
呃,我的意思是,__set, __get方法其实就是用来访问其中不存在或私有private的成员的方法。手册中如下说明:
“在给不可访问属性赋值时,__set() 会被调用。”
参见:http://www.php.net/manual/zh/language.oop5.overloading.php
你的 __set 方法是定义在 Far 中的,所以他不能访问 Son 的私有属性
这样写就可以了
class Far { protected $arr; protected function init() { foreach ($this->arr as $k => $val) { $this->$k = $val; } } public function __construct() { $this->init(); } public function __set($name, $val) { $this->$name = $val; }}class Son extends Far { private $a; public function __construct() { $this->arr = array( 'a' => '1', ); parent::__construct(); } public function __set($name, $val) { $this->$name = $val; }}$obj = new Son();print_r($obj);
(
[a:Son:private] => 1
[arr:protected] => Array
(
[a] => 1
)
)
你的 __set 方法是定义在 Far 中的,所以他不能访问 Son 的私有属性
这样写就可以了
class Far { protected $arr; protected function init() { foreach ($this->arr as $k => $val) { $this->$k = $val; } } public function __construct() { $this->init(); } public function __set($name, $val) { $this->$name = $val; }}class Son extends Far { private $a; public function __construct() { $this->arr = array( 'a' => '1', ); parent::__construct(); } public function __set($name, $val) { $this->$name = $val; }}$obj = new Son();print_r($obj);
(
[a:Son:private] => 1
[arr:protected] => Array
(
[a] => 1
)
)
是的,我之所以写在父类中,就是不想在每个子类中写一个__set,按您所说的是没有问题的。不过让我不明白的是,即然它能从父类得到这个__set的方法。与写在自己内部的__set方法,在操作成员时,倒底有什么不同的。
私有的是不可侵犯的
仔细品味#7的第二句话
私有的是不可侵犯的
仔细品味#7的第二句话
有一点我不明白的是,如果我在__set打印当前$this,这里我得到的是子类对象。那接着$this->name不就是子类对象的方法操作自己的成员么?为可这里权限却没有了。
要说多少遍你才能转过弯来呢?
私有的属性,只能被他所在类定义的方法访问
请注意类和对象的区别
要说多少遍你才能转过弯来呢?
私有的属性,只能被他所在类定义的方法访问
请注意类和对象的区别
如果你这样说,我就能理解了。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP でデータベースを操作するのは非常に簡単です。この章では、CRUD (作成、読み取り、更新、削除) 操作について理解します。

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー
