PHP 中有 __set、__get、__call 等方法来实现一些动态的特性,比如动态的对象属性等。
本文讲述 Ruby 中对应这几个方法的实现。
__call
对应 Ruby 中method_missing(name, *arguments)
__set
对应 Ruby 中method_missing(name=)
__get
对应 Ruby 中method_missing(name)
注意:
method_missing
里面的 name 是一个符号,不是字符串。
来验证一下:
先定义一个类,里面只有一个 method_missing
方法
1 | class Person |
- 访问对象属性
1 | p = Person.new |
输出:
1 | name: age |
我们发现上面的 p.age
实际上是执行了
method_missing('age')
- 设置对象属性
1 | p = Person.new |
输出
1 | name: age= |
我们发现 p.age = 23
实际上等同于
method_missing('age', 23)
- 调用一个不存在的方法
1 | p = Person.new |
输出
1 | name: test |