【问题描述】:

所以我正在尝试解决我在设计 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吗,它允许你在运行时更改任何东西/任何属性,无论它是私有的

标签: php oop class private protected


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