ホームページ バックエンド開発 PHPチュートリアル PHPでのメンバーの権限について混乱しています

PHPでのメンバーの権限について混乱しています

Jun 23, 2016 pm 01:57 PM
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);
ログイン後にコピー
ログイン後にコピー
Son Object
(
[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);
ログイン後にコピー
ログイン後にコピー
Son Object
(
    [a:Son:private] => 1
    [arr:protected] => Array
        (
            [a] => 1
        )

)



是的,我之所以写在父类中,就是不想在每个子类中写一个__set,按您所说的是没有问题的。不过让我不明白的是,即然它能从父类得到这个__set的方法。与写在自己内部的__set方法,在操作成员时,倒底有什么不同的。

私有的是不可侵犯的
仔细品味#7的第二句话

私有的是不可侵犯的
仔细品味#7的第二句话



有一点我不明白的是,如果我在__set打印当前$this,这里我得到的是子类对象。那接着$this->name不就是子类对象的方法操作自己的成员么?为可这里权限却没有了。

要说多少遍你才能转过弯来呢?
私有的属性,只能被他所在类定义的方法访问
请注意类和对象的区别

要说多少遍你才能转过弯来呢?
私有的属性,只能被他所在类定义的方法访问
请注意类和对象的区别



如果你这样说,我就能理解了。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

この章では、CakePHP の環境変数、一般設定、データベース設定、電子メール設定について理解します。

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

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

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP データベースの操作 CakePHP データベースの操作 Sep 10, 2024 pm 05:25 PM

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

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

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

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

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

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

See all articles