[关闭]
@tingyuge 2016-07-28T23:40:12.000000Z 字数 1846 阅读 2954

php的魔法方法__set()与__get()

PHP

我们先来看看官方的文档如何定义他们的:

public void __set(string value);

public mixed __get(string $name);

在给不可访问的属性赋值时,__set()会被调用。

读取不可访问的属性的值时,__get()会被调用。

在实际的应用中,经常需要将一些属性设置为私有的属性,不能为外部随便的更改,这个时候要更改不可见的属性的时候可以通过:
1. 创建一个专门用于设置与读取值得setter,getter。
2. 使用php的魔法方法__set(), __get()便可以方便的设置与读取属性。

有代码才有真相嘛:

  1. <?php
  2. /** setget.php **/
  3. /**
  4. * 测试__set()和__get()的作用于用法
  5. */
  6. class Person {
  7. private $name;
  8. private $age = 20;
  9. // 故意设置为public
  10. public $sex = 'girl';
  11. function __construct() {
  12. }
  13. public function __set($name, $value) {
  14. echo 'setting ' . $name . ' to ' . $value . '<br />';
  15. $this->$name = $value;
  16. }
  17. public function __get($name) {
  18. echo 'getting ' . $name . ' ';
  19. return isset($this->$name) ? $this->$name : null;
  20. }
  21. }
  22. echo '<pre>';
  23. $person = new Person();
  24. $person->name = 'tingyugetc';
  25. echo $person->name . '<br />';
  26. $person->sex = 'boy';
  27. echo $person->sex . '<br />';
  28. $person->age = 21;
  29. echo $person->age . '<br />';
  30. $person->city = '南京';
  31. echo $person->city . '<br />';
  32. print_r($person);
  33. echo 'unset<br />';
  34. unset($person->city);
  35. //不可以对不可见属性直接调用unset,需要重载__unset()才可以
  36. //PHP Fatal error: Cannot access private property Person::$name in setget.php on line 47
  37. // unset($person->name);
  38. print_r($person);
  39. /**
  40. * 测试不使用__set(),__get()时访问不可见的属性
  41. */
  42. class Student {
  43. private $name;
  44. public $core;
  45. function __construct() {
  46. }
  47. }
  48. $student = new Student();
  49. // 不可以直接访问不可见属性
  50. // PHP Fatal error: Cannot access private property Student::$name in setget.php on line 66
  51. // $student->name = 'tingyugetc';
  52. // echo $student->name . '<br />';
  53. $student->core = 100;
  54. echo $student->core . '<br />';
  55. print_r($student);
  56. ?>

以上代码的输出结果为:

  1. 此处可见对于private属性的访问调用了__set,__get
  2. setting name to tingyugetc
  3. getting name tingyugetc
  4. 此处可见对于public属性的访问没有调用
  5. boy
  6. setting age to 21
  7. getting age 21
  8. 此处可见对于类中没有定义的属性在set的时候会调用__set()
  9. 然而在读取的时候并不调用__get
  10. 对象新创建的属性默认为public
  11. setting city to 南京
  12. 南京
  13. Person Object
  14. (
  15. [name:Person:private] => tingyugetc
  16. [age:Person:private] => 21
  17. [sex] => boy
  18. [city] => 南京
  19. )
  20. unset
  21. Person Object
  22. (
  23. [name:Person:private] => tingyugetc
  24. [age:Person:private] => 21
  25. [sex] => boy
  26. )
  27. 100
  28. Student Object
  29. (
  30. [name:Student:private] =>
  31. [core] => 100
  32. )
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注