从类外部访问类属性

时间:2011-07-19 15:36:19

标签: php oop

假设我有以下课程:

class MyClass {
    public function Talk() {
        $Say = "Something";
        return $Say;
    }
}

然后我开始了一个类的实例:

$Inst = new MyClass();

我现在如何在MyClass之外调用$ Say,例如,在文档上回显它?例如,有类似的东西:

$Said = "He" . $Say

6 个答案:

答案 0 :(得分:7)

我强烈建议您通读 http://php.net/manual/en/language.oop5.php 。它将教你PHP中OOP的基础知识。


在您的示例中,$Say只是在Talk()范围内声明的另一个变量。它是类属性。

使它成为一个类属性:

class MyClass {
    public $say = 'Something';

    public function Talk() {
        return $this->say;
    }
}

$inst = new MyClass();
$said = 'He ' . $inst->say;

然而,这违背了Talk()的目的。
最后一行应该是$said = 'He '. $inst->Talk();

答案 1 :(得分:1)

$say不是类属性。如果是,你会像这样定义你的类:

class MyClass {
    public $say;      
}

它是函数Talk()的局部变量。如果您想按照定义类的方式访问它,您可以这样做:

$instance = new MyClass();
$instance->Talk();

答案 2 :(得分:1)

你需要让$ Say成为MyClass类的即时变量。

class MyClass {
    public $Say
    public function Talk() {
        $this->Say = "Something";
        return $this->Say;
    }
}

然后,您可以通过类外部访问实例变量     $ Inst->再说

此外,更好的做法是封装您的类实例变量并使用“getter”方法来检索值。

class MyClass {
    private $Say
    public function Talk() {
        $this->Say = "Something";
        return $this->Say;
    }
    public getSay() {
        return $this->Say;
    }
}

$Inst = new MyClass();
echo $Inst->getSay();

答案 3 :(得分:0)

您可以使用

$said = "He" . $Inst->Talk();

在这种情况下,或者你可以 班级

class MyClass {
var $say;
public function Talk() {
    $say = "Something";
    $this->say = $say;
    return $say;
}
}

并致电

$said = "He" . $Inst->say;

答案 4 :(得分:0)

您需要在函数之前声明var,例如

class MyClass {
  public $say;
  function Talk() {
    $this->say = "something";
  }
}

然后

$Said = "He ".$Inst->$say;

答案 5 :(得分:0)

oop的最佳做法绝不是你班上的公共财产。操纵类属性的最佳方法是使用单独的方法返回属性的值并设置属性的值。 所以

class MyClass {
    private $say;

    // common setter, invoked when we trying to set properties as they are public
    public function __set($name, $value) {
        $methodname = 'set' . ucfirst(strtolower($name));
        if (method_exists($this, $methodname)) {
            $this->$methodname($value);
        } else {
            throw new Exception ('There is no "' . $name . '" property in "' . __CLASS__ . '" class');
        }
    }

    // common getter, invoked when we trying to get properties as they are public
    public function __get($name) {
        $methodname = 'get' . ucfirst(strtolower($name));
        if (method_exists($this, $methodname)) {
            return $this->$methodname();
        } else {
            throw new Exception ('There is no "' . $name . '" property in "' . __CLASS__ . '" class');
        }
    }

    // setter for out private property $say, invoked by common setter when colling $a->say = "something";
    public function setSay($value) {
        $this->say = $value;
    }

    // getter for out private property $say, invoked by common getter when colling $a->say;
    public function getSay() {
        return $this->say;
    }

    public function Talk($monologue) {
        $this->say = (!empty($monologue))?$this->say:$monologue;
        return $this->say;
    }

}

现在,您可以访问私有属性,因为它们是公共的,并且执行所有必要的检查以避免将错误值存储在其中。 像那样:

$a = new MyClass;
$a->say = "Hello my friends !";
$a->Talk();
$a->Talk("Good bye !");
echo $a->say;

或者那样:

$a = new MyClass;
$a->setSay("Hello my friends !");
$a->Talk();
$a->Talk("Good bye !");
echo $a->getSay();

为了更加安全,您可以将setSay和getSay方法设为私有,但第二段代码将不起作用。