概括
代码示例:
Class People {
// private property.
private $name;
// other methods not shown for simplicity.
}
直线前进。让我假设它$name
是PRIVATE类成员(或属性、变量、字段,随意调用)。有没有办法在 PHP 中做到这些:
$someone = new People();
$someone->name = $value;
$somevar = $someone->name;
不使用__get($name)
and __set($name, $value)
。
背景
我需要检查assigned $value
,因此我只需要一个像这样的getter setter:
getName();
setName($value);
而且不一定像这样重载getter setter魔术方法:
__get($value);
__set($value, $name);
也就是说,我只需要一个吸气剂二传手。但这不是我想要的。它只是感觉不像是面向对象的,因为使用静态类型语言(如 C++ 或 C#)的人可能会有和我一样的感觉。
有什么方法可以像在 C# 中一样在 PHP 中获取和设置私有属性,而无需使用 getter setter 魔术方法重载?
更新
为什么不是魔术方法?
网上有传言说魔术方法比显式 getter setter 方法慢 10 倍,我还没有测试过,但要记住这是一件好事。(发现它并没有那么慢,只是慢了 2 倍,请参阅下面的基准测试结果)
如果我使用魔术方法而不是将它们拆分为每个属性的不同函数,就像在显式 getter setter 中那样,我必须将所有内容都填充到一个巨大的方法中。(此要求可能已由ircmaxell回答)
性能开销基准测试
我很好奇使用魔法方法和显式 getter setter 之间的性能开销,因此我为这两种方法创建了自己的基准,希望它对任何阅读本文的人都有用。
使用魔术方法和method_exist:
(点击这里查看代码)
- 吸气剂花费 0.0004730224609375 秒。
- Setter 花费 0.00014305114746094 秒。
使用显式 getter setter:
(点击这里查看代码)
- 吸气剂花费 0.00020718574523926 秒。
- Setter 花费 7.9870223999023E-5 秒(即 0.00007xxx)。
也就是说,具有魔术方法和方法的 setter 和 getter 的成本是显式 getter setter 的 2 倍。我认为将它用于中小型系统仍然可以接受。