<?php
class Post {
private $title;
private $content;
private $author;
private $comments;
private $_getters = array('title', 'content', 'author', 'comments');
private $_setters = array('title', 'content', 'author');
public function __get($property) {
if (in_array($property, $this->_setters)) {
return $this->$property;
}
else if (method_exists($this, '_get_' . $property))
return call_user_func(array($this, '_get_' . $property));
else if (in_array($property, $this->_getters) OR method_exists($this, '_set_' . $property))
throw new Exception('Property "' . $property . '" is write-only.');
else
throw new Exception('Property "' . $property . '" is not accessible.');
}
public function __set($property, $value) {
if (in_array($property, $this->_getters)) {
$this->$property = $value;
}
else if (method_exists($this, '_set_' . $property))
call_user_func(array($this, '_set_' . $property), $value);
else if (in_array($property, $this->_setters) OR method_exists($this, '_get_' . $property))
throw new Exception('Property "' . $property . '" is read-only.');
else
throw new Exception('Property "' . $property . '" is not accessible.');
}
}
?>
This way the variables in the $_getters array can be read from the outside and the variables in the $_setters array can be modified from the outside, like this:
<?php
$post = new Post();
$post->title = 'Hello, World';
echo $post->title;
// The following will throw an exception since $comments is read-only:
$post->comments = 23;
?>
And in case you need a less generic getter or setter at some point, you can remove the variable from the $_getters or $_setters array and implement a method like:
<?php
private function _set_title($value) {
$this->title = str_replace('World', 'Universe', $value);
}
?>
And from the outside the property could still be used with:
<?php
$post->title = 'Hello, World!';
?>
上面是手册里的例子,但是我觉得应该是先判断类里面是否有处理属性的方法,有的话就调用该方法,没有就直接设置该属性。
分享到:
相关推荐
PHP中的魔术方法__get()和__set()是面向对象编程中非常重要的特性,它们主要用于处理类中的属性访问控制。使用这两个方法,开发者可以定义对象在尝试获取不存在的属性值或者设置属性值时的行为。 首先,__get()方法...
本文将详细介绍两个重要的魔术方法:`__get()`和`__set()`,以及它们在处理不可访问属性时的角色。 首先,让我们看下PHP官方文档对这两个方法的解释: `__set()`是在尝试向不可访问的属性写入数据时被调用的。 `__...
PHP中的魔术方法有 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone, __autoload 1、__get、__set 这两个方法是为在...
除了魔术变量,PHP还有魔术函数,如`__construct()`用于对象的构造,`__destruct()`用于对象销毁,`__get()`和`__set()`处理未定义的属性访问,`__call()`和`__callStatic()`处理未定义的方法调用等。这些函数可以...
### PHP魔术方法详解 #### 一、概述 在PHP中,魔术方法是一组特殊的方法,它们具有特定的名称,可以在特定的情况下自动触发。魔术方法在PHP的开发中扮演着非常重要的角色,尤其对于面向对象编程而言,它们提供了一...
在本文中,我们将深入探讨几个重要的PHP魔术方法及其用法。 1. `__toString()`: 这个方法允许一个类定义当其对象转换为字符串时的行为。在示例中,`__toString()` 方法返回 `$this->foo` 的值。当尝试将对象转换...
在PHP面向对象编程中,`__set()`、`__get()`、`__isset()`和`__unset()`被称为魔术方法,它们提供了一种处理私有或受保护属性的灵活性。这些方法在特定的情况下自动调用,使得我们可以间接地访问或操作原本不可直接...
__get和__set魔术方法用于在访问未定义的属性时触发,__get在读取未定义属性时触发,而__set在设置未定义属性时触发。__autoload函数是在尝试使用尚未定义的类时自动调用的,它的目的是让脚本引擎在出错前有机会加载...
在PHP编程语言中,魔术常量和魔术方法是两种特殊的功能,它们在特定情况下自动触发,使得代码能够处理一些特定的场景。以下是关于这些概念的详细说明: **魔术常量**: 1. `__FILE__`: 返回当前脚本的完整路径和...
PHP中比较常用的魔术方法包括:__construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__isset()、__unset()、__sleep()、__wakeup()、__toString()、__invoke()、__set_state()、__clone() 和...
PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用。 魔术方法包括: __construct(),类的构造函数 __destruct(),类的析构函数 __call(),在对象中调用一个不...
以下就是对标题【PHP魔术方法功能与用法实例分析】和描述【主要介绍了PHP魔术方法功能与用法,结合实例形式简单分析了PHP面向对象程序设计中常见魔术方法的功能与相关使用技巧】中所提及知识点的详细解释。...
通过使用__get()和__set()这两个魔术方法,我们可以方便地对私有属性进行封装和操作,它们会在尝试读取或设置私有属性时自动被调用。 __get()方法用于在尝试获取一个不存在的属性值时自动执行。当在类外部尝试访问...
我们在PHP中经常用到魔术方法,像构造方法,析构方法等等魔术变量,下面总结一下一些常用的魔术变量: __construct(),__destruct(),__clone(),__autoload(),__tostring(),__invoke(),__set(),__get(),__unset(),__is...
以下是对标题、描述及部分给定内容中提及的PHP魔术函数和常量的详细解析。 ### 魔术函数 1. **\_\_construct()**:这是对象实例化时自动调用的构造函数,用于初始化对象的状态。通过定义此函数,开发者可以在对象...
### PHP魔术函数详解 在PHP编程中,魔术函数是一组特殊的方法,它们可以在特定的情况下自动被调用。这些函数之所以被称为“魔术”,是因为它们的行为似乎是由PHP解释器自动触发的,而无需程序员显式地调用。下面...