我是PHP的新手,我正在努力学习本书: http://www.amazon.co.uk/PHP-MySQL-Development-Developers-Library/dp/0672329166
所以我在第6章:面向对象的PHP,我发现这个主题真的很难理解。
首先,
是什么 public function __set($name, $value)
{
$this->$name = $value;
}
做什么? __get也一样。
在阅读了本章的大部分内容并且没有真正理解它之后,我想我会尝试在我的网站中实现类和对象,这样我就可以通过实验来理解。
我没有走得太远:D
这就是我所拥有的(class_lib.php):
<?php
class Page
{
public $header = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n
<html xmlns=\"http://www.w3.org/1999/xhtml\">\n
<head>\n
<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />";
public function __set($name, $value)
{
$this->$name = $value;
}
public function Display() {
$this -> DisplayHeader();
}
public DisplayHeader() {
echo $this->header;
}
}
&GT;
和(index.php):
<?php
require("class_lib.php");
$class = new Page();
$class->Display();
&GT;
我在Google Chrome中加载文件时遇到的错误是:
解析错误:语法错误,意外的T_STRING,在第15行的C:\ wamp \ www \ PS v3(PHP)\ class_lib.php中期待T_VARIABLE
我想如果我知道__set的意思,我可能有机会找出那部分。
任何答案/建议都将受到广泛赞赏:)
答案 0 :(得分:4)
class Test
{
public function __get($name)
{
echo "= $name<br>";
return "value";
}
public function __set($name, $value)
{
echo "$name = $value<br>";
}
}
$test = new Test();
$test->setvar123 = "SETVALUE"; // will output "setvar123 = SETVALUE"
$var = $test->getvar123 // will output "= getvar123" and $var will be "value"
基本上,__get
和__set
是魔术关键词,它拦截任何在不存在的类上设置和获取“变量”的尝试。意思是,你可以用任何你喜欢的方式替换默认的get / set功能......比如将数据存储在一个单独的数组中,输出,验证,保存到数据库,从数据库中读取等等。
编辑:public DisplayHeader() ...
也应为public function DisplayHeader() ...
为了呈现另一个更实用的示例,此类允许您只设置一次变量,如果您尝试读取一个不存在的变量或分配给已经设置的变量,则抛出异常。此外,它还将这些变量存储在$ data中,而不是类本身。
class Test
{
private $data = array();
public function __get($name)
{
if (!isset($this->data[$name])) throw new Exception("key does not exist!");
return $this->data[$name];
}
public function __set($name, $value)
{
if (isset($this->data[$name])) throw new Exception("key already exists!");
$this->data[$name] = $value;
}
}
答案 1 :(得分:1)
要理解你的问题的答案,你需要具备面向对象编程的一些背景知识。
一个类可以包含'属性'。此上下文中的属性基本上是一段可以从对象外部引用的数据。
如果您将变量声明为public
,那么它就是一个属性。在您的代码中,您已将$header
声明为公开,因此您可以$header
访问$test
对象的$test->header
变量。
您可以通过撰写$header
获取 print $test->header;
的值。同样,您可以使用代码$header
设置 $test->header = "new value";
的值。
换句话说,它就像任何其他变量一样工作。
但是,例如,如果您只想允许$header
被读取但未被更改,会发生什么?作为一个公共属性,调用该对象的程序可以做任何它喜欢的事情。
这就是魔术函数__get
和__set`发挥作用的地方。
使用这些功能,您可以隐藏实际的$header
变量,方法是private
而不是公开,但仍然可以根据您自己的条件授予其访问权。
因此,在上面的示例中,您可以编写一个__get
方法来输出标头变量,但不能编写匹配的__set
方法。或者您可以编写一个在设置时验证其符合条件的文件。
因此,您的问题的答案是__get
和__set
是允许您隐藏类中的原始变量并为用户提供抽象方式的函数。
另一个示例是具有height
和width
属性的类,但您还希望为用户提供方便的area
属性。你显然不希望area
有一个单独的变量,所以你只需编写一个__get
方法,当用户要求该区域时,该方法返回高度乘以宽度。同样,您不希望为此编写__set
方法。这当然也可以写成一个函数,但是将它作为属性提供是有意义的,因为它是一个数据值。
有很多方法可以使用它们,但这是基础知识。我希望我已经解释得很好。
答案 2 :(得分:0)
关于您的错误,您在显示功能中缺少function关键字。变化
public DisplayHeader() {
echo $this->header;
}
到
public function DisplayHeader() {
echo $this->header;
}
答案 3 :(得分:0)
您的错误是因为您在声明DisplayHeader()时遗漏了“函数”。 至于_ get / _set请查看http://us.php.net/__get以开始。
__set() is run when writing data to inaccessible properties.
__get() is utilized for reading data from inaccessible properties.
答案 4 :(得分:0)