来自孩子的PHP私有变量访问

Posted

技术标签:

【中文标题】来自孩子的PHP私有变量访问【英文标题】:PHP Private variable access from child 【发布时间】:2012-06-05 07:50:23 【问题描述】:

所以我正在尝试解决我在设计 php 类时遇到的问题。我创建了一个基类,并分配了私有变量。我有扩展这个基类的子类,它们通过基类的函数对这些私有变量进行引用和更改。这是一个示例,请记住,我仍然对 privateprotected 方法/变量之间的区别感到困惑(如果我做错了,请告诉我!):

base.class.php

<?php
class Base 
    private $test;
    public function __construct()
        require('sub.class.php');
        $sub = new Sub;
        echo($this->getTest());
    
    public function getTest()
        return $this->test;
    
    protected function setTest($value)
        $this->test = $value;
    

?>

sub.class.php

<?php
class Sub extends Base 
    public function __construct()
        parent::setTest('hello!');
    

?>

所以我希望结果是hello! 打印在屏幕上——而不是什么都没有。我可能对课程有根本的误解,或者我只是做错了什么。非常感谢任何指导!谢谢。

编辑:

感谢所有提供答案的人 - 我认为,尽管有出色的解决方案,但子类实际上并不是我需要的 - 在这一点上,委托类似乎更有用,因为我真的不需要从其他类中引用 Base 函数。

【问题讨论】:

试试PHP5 OOP。 屏幕上没有任何echoprint可以输出东西 @bumperbx - 这行得通……但这对我的目的来说可能不切实际。 那么你见过php extension runkit,它允许你在运行时更改任何东西/任何属性,无论它是私有的 【参考方案1】:

应该是这样的:

base.class.php:

class Base 
    private $test;
    public function __construct() 
        echo $this->getTest();
    
    public function getTest() 
        return $this->test;
    
    protected function setTest($value) 
        $this->test = $value;
    

sub.class.php:

class Sub extends Base 
    public function __construct() 
        parent::setTest('hello!');  // Or, $this->setTest('hello!');
        parent::__construct();
    

主要代码:

require 'base.class.php';
require 'sub.class.php';

$sub = new Sub;  // Will print: hello!

【讨论】:

我也会用$this-&gt;替换parent:: 好的,我明白为什么这与我认为的相反。有什么方法可以从子函数引用父函数的 setTest 函数,以便代码$this-&gt;test = $value 为父函数设置变量,而不是子函数?如果我可以从孩子的构造函数中拨打电话,我最终希望不必拨打电话。我基本上想访问父函数,而不是继承它们。 @iLoch 我不太明白你的意思,但看看我编辑的代码。是你想要的吗? 基本上,是的。我能理解理解起来有多复杂——我觉得我的解释不是应该怎么做。让我尝试详细说明.. 我有基地和孩子。我希望孩子操纵基函数的变量,以便当它调用 setTest 函数时,对$this 的引用指的是基函数,而不是(在您的示例中)从基函数继承该函数的子函数。这可能吗?因此,我不想继承一个函数,而是想简单地使用它,以便对 $this 的引用保持在原始范围(基础)中 您可能会想到的一种方法是,如果 setTestgetTest 函数都使用 Base:: 而不是使用 $this-&gt;,那么变量总是被写入/读取/读取基类,而不是子类。

以上是关于来自孩子的PHP私有变量访问的主要内容,如果未能解决你的问题,请参考以下文章

PHP继承的父方法无法访问孩子的私有属性

从 C++ 中的类访问私有变量

Twig 访问受保护/私有模型变量

子类会在后台包含来自超类的私有方法和成员变量吗? [复制]

为什么在OO PHP中不经常使用私有变量和方法? [关闭]

js:私有变量和静态私有变量 | 访问私有属性