php中一个成员权限困惑
问题:有如下代码:
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
{
protected $a;
public function __construct() {
$this->arr = array(
'a' => '1',
);
parent::__construct();
}
}
$obj = new Son();
print_r($obj);
问:为什么$obj输出的结果中,a不是1,而是null.
Son Object
(
[a:protected] => 1
[arr:protected] => Array
(
[a] => 1
)
)
问题2:如果把上述代码中,子类的private $a 改成protected $a 或public $a,则输出:
Son Object
(
[a:protected] => 1
[arr:protected] => Array
(
[a] => 1
)
[bb] => 1
)
为什么?
回复讨论(解决方案)
不明白你在说什么?
你打印的结果不是正确的吗?
纠正一下,private时打印的结果如下:
Son Object( [a:Son:private] => [arr:protected] => Array ( [a] => 1 ) [bb] => 1)
son::a 是私有的,far:: init 访问不到他
son::a 是私有的,far:: init 访问不到他
不是有个__set魔术方法么?
__set 不是 far 的吗?
__set 不是 far 的吗?
子类不是继承了它么?
$Son->bb = 1;
可以证明 Son得到了Far的__set
不错,方法是继承了,但权限并没有因继承而改变
老婆是你的,并不能说你老子就能碰
不错,方法是继承了,但权限并没有因继承而改变
老婆是你的,并不能说你老子就能碰
是的,那么__set中的$this不是指向的当前实例对象,也就是Son的一个实例哦。而__set的作用就是可以用于访问private或不存在的成员,
代?不完整啊,看了半天,都?看到有$bb。
代?不完整啊,看了半天,都?看到有$bb。
Sorry,$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不就是子类对象的方法操作自己的成员么?为可这里权限却没有了。
要说多少遍你才能转过弯来呢?
私有的属性,只能被他所在类定义的方法访问
请注意类和对象的区别
要说多少遍你才能转过弯来呢?
私有的属性,只能被他所在类定义的方法访问
请注意类和对象的区别
如果你这样说,我就能理解了。

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

In diesem Kapitel werden wir die Umgebungsvariablen, die allgemeine Konfiguration, die Datenbankkonfiguration und die E-Mail-Konfiguration in CakePHP verstehen.

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

Um in cakephp4 mit Datum und Uhrzeit zu arbeiten, verwenden wir die verfügbare FrozenTime-Klasse.

Um am Datei-Upload zu arbeiten, verwenden wir den Formular-Helfer. Hier ist ein Beispiel für den Datei-Upload.

In diesem Kapitel lernen wir die folgenden Themen im Zusammenhang mit dem Routing kennen.

CakePHP ist ein Open-Source-Framework für PHP. Es soll die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich vereinfachen. CakePHP basiert auf einer MVC-ähnlichen Architektur, die sowohl leistungsstark als auch leicht zu verstehen ist. Modelle, Ansichten und Controller gu

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

Der Validator kann durch Hinzufügen der folgenden zwei Zeilen im Controller erstellt werden.
