OO PHP问题

时间:2011-09-04 15:14:49

标签: php

我是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的意思,我可能有机会找出那部分。

任何答案/建议都将受到广泛赞赏:)

5 个答案:

答案 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是允许您隐藏类中的原始变量并为用户提供抽象方式的函数。

另一个示例是具有heightwidth属性的类,但您还希望为用户提供方便的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)

修改

对此抱歉,原来我完全错了!该链接无论如何都很有用:

PHP网站实际上非常棒,对初学者非常有帮助。一定要看看! http://www.php.net/

相关问题