发布于 2017-03-22 12:13:30 | 132 次阅读 | 评论: 0 | 来源: PHPERZ

这里有新鲜出炉的PHP设计模式,程序狗速度看过来!

PHP开源脚本语言

PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适用于Web开发领域。PHP的文件后缀名为php。


一般来说,总是把类的属性定义为private,这更符合现实的逻辑。但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性,以及检查属性的“__isset()”和删除属性的方法“__unset()”。

//__get()方法用来获取私有属性
public function __get($property_name)
{
    if(isset($this->$property_name))
    {
    return($this->$property_name);
    }else
    {
    return(NULL);
    }
    }
//__set()方法用来设置私有属性
public function __set($property_name, $value)
{
    $this->$property_name = $value;
}

__get()方法:这个方法用来获取私有/保护成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值,这个方法不用我们手工的去调用,它必须做出public,是在直接获取私有/保护属性的时候对象自动调用的。如果成员属性封装成共有的,对象本身就不会去自动调用这个方法。

__set()方法:这个方法用来为私有/共有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。这个方法同样不用我们手工去调用,它必须做出public,是在直接设置私有/保护属性值的时候自动调用的

如果没有__set()这个方法,是不允许的,比如:$this->name=‘zhangsan’, 这样会出错,但是如果你在类里面加上了__set($property_name, $value)这个方法,在直接给私有属性赋值的时候,就会自动调用它,把属性比如name传给$property_name, 把要赋的值“zhangsan”传给$value,通过这个方法的执行,达到赋值的目的。如果成员属性公有的,对象本身就不会去自动调用这个方法。为了不传入非法的值,还可以在这个方法给做一下判断。代码如下:

<?php
class Person
{
    private $name;        //人的名子
    private $sex;         //人的性别
    private $age;         //人的年龄
    public $class;
    protected $class2;
//__get()方法用来获取私有属性
    public function __get($property_name)
    {
        echo "在直接获取私有属性值的时候,自动调用了这个__get()方法<br>";
        if(isset($this->$property_name))
        {
            return($this->$property_name);
        }
        else
        {
            return(NULL);
        }
    }
//__set()方法用来设置私有属性
    public function __set($property_name, $value)
    {
        echo "在直接设置私有属性值".$property_name."的时候,自动调用了这个__set()方法为私有属性赋值<br>";
        $this->$property_name = $value;
    }
}
$p1=new Person();
//直接为私有属性赋值的操作,会自动调用__set()方法进行赋值
$p1->name="张三";
$p1->sex="男";
$p1->age=20;
$p1->high=173;
$p1->class='二班';//不会调用__set魔术方法
$p1->class2='三班';
var_dump($p1);
//object(Person)[1]
//  private 'name' => string '张三' (length=6)
//  private 'sex' => string '男' (length=3)
//  private 'age' => int 20
//  public 'high' => int 173
//直接获取私有属性的值, 会自动调用__get()方法,返回成员属性的值
echo "姓名:".$p1->name."<br>";
echo "性别:".$p1->sex."<br>";
echo "年龄:".$p1->age."<br>";
echo "身高:".$p1->high."<br>";
?>


总的来说上面参考文档还不错,但是从实验数据来看有两个错的:
1》set,get必须是public才行,否则有警告,不是原文的private!
2》set,get可以设置和获取私有和保护两种属性的值,公有属性不会自动调用set和get方法,而不是只有私有属性值。



最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务