我正在努力了解一些面向对象的基础知识。我写了这个简单的脚本,但很困惑为什么它的工作方式。
class Foo
{
function run($text = null)
{
$this->bar = strtolower($text);
echo $this->bar;
}
}
$foo = new Foo;
$foo->run('THIS IS SOME TEXT IN LOWER CASE');
脚本按预期输出“这是一些小写的文本”。
但令我困惑的是,为什么我可以在不实际声明$bar
变量的情况下执行此操作。为什么我只能使用$this->bar
?也许我不理解$this
如何正常工作,但我一直认为你必须在类中使用它之前声明一个变量。例如public $bar;
感谢您提供的任何见解。
答案 0 :(得分:3)
如果您正在访问对象变量而不将其声明为类成员,PHP将自动将对象变量声明为public。这不是魔术,只是一个“功能”;)
但是,一个好的设计不应该使用这个“功能”,而是明确声明任何类成员。你的课应该是这样的:
class Foo
{
/**
* some description
*
* @var <type>
*/
protected $bar;
...
function run($text = null)
{
$this->bar = strtolower($text);
echo $this->bar;
}
}
答案 1 :(得分:0)
您需要在类方法之外的变量前放置protected
或private
,以将类变量声明为public
以外的任何变量。在PHP中,赋值是声明,如果它尚未声明。请注意,您也可以这样做:
$ary = array('a', 'b', 'c', 'd');
foreach($ary as $v){
$newArray[] = $v;
}
注意,我从未在循环之前声明$newArray = array();
。
答案 2 :(得分:0)
您可以在类(a.k.a.属性)中声明变量,如下所示:
class Foo {
public $bar;
}
请注意public
关键字。在这里,我们声明了该属性的可见性。可见性有三种类型:public
,private
和protected
。
这也适用于方法。我不会详细介绍,但您可以阅读更多here。
如果您没有声明属性,但是在方法中设置了一个属性,那么PHP会自动为您声明属性并指定您指定的值。
答案 3 :(得分:0)
你应该看看http://php.net/manual/en/language.oop5.magic.php
考虑一下你声明一个以前不存在的变量的方式,在对象之外,在对象内部会发生同样的方式,因为它们键入不好。