<?php
class test{
function foo(){
echo $this->abc;
}
}
$test = new test;
$test->abc = 'abc';
?>
记得我没有声明变量abc,但我想将$ abc设置为'abc'。这该怎么做 对不起,因为这是一个虚拟问题
答案 0 :(得分:2)
我会使用PHP支持的魔术方法。基本上我会构建一个构造函数,它以字符串作为参数。
<?php
class Test {
public $abc;
public function __construct($abc) {
$this->abc = $abc;
}
public function __toString() {
return $this->abc;
}
}
然后你可以调用这个类并像这样传递你想要的数据。
$myClass = new Test('abc');
echo $myClass;
当然你必须回应它,以便调用魔术方法__toString()。
答案 1 :(得分:1)
class test{
public function __construct() {
$this->abc = 'abc';
}
public function foo(){
echo $this->abc;
}
}
$test = new test;
$test->abc = 'abc';
当实例化对象时自动执行构造函数时,$ abc将被创建为类test的公共属性
OR
class test{
$this->abc = 'abc';
public function foo(){
if (!isset($this->abc))
$this->abc = 'abc';
echo $this->abc;
}
}
$test = new test;
$test->abc = 'abc';
当你调用foo方法时,如果它还不存在,会在类test的实例中创建一个名为$ abc的公共属性
答案 2 :(得分:1)
你测试过吗?虽然我不确定这是个好主意,但它确实有用。
答案 3 :(得分:1)
你可以通过重载php的一些神奇功能来'动态创建'属性和函数。有关详细信息,请参阅this链接。通常,在初始化类时会使用__construct函数来创建变量(如Mark Baker和MAINERROR已经建议的那样)。这是首选的方式。
但是,您可以覆盖(在您的情况下)__set函数来处理不可访问属性的设置。但请记住,覆盖和使用这些函数(除了__construct)可能会非常快速地混淆。
答案 4 :(得分:0)
实际上,这已经有效了。但这是一种不好的做法。
通常你应该这样做:
class test {
private $abc;
public function foo() {
echo $this->abc;
}
public function getABC() {
return $this->abc;
}
public function setABC($abc) {
// You can also add some additionally checks
$this->abc = $abc;
}
}
这使得:
$bar = new test;
$bar->setABC('abc');
$bar->foo();
请记住使您的类属性($ abc)始终保持私有或受保护。它的封装使得OOP如此强大。
如果你想使用动态变量名,那么你要设置$ this-&gt; cba而不是$ this-&gt; abc,你应该使用魔术方法__set和__get
有关魔术方法的更多信息,请点击此处:
http://php.net/manual/en/language.oop5.magic.php