当前位置: 首页 > 面试题库 >

最佳实践:PHP魔术方法__set和__get

宋鸿德
2023-03-14
问题内容

这些是简单的示例,但是假设您的类中的属性多于两个。

什么是最佳做法?

a)使用__get和__set

class MyClass {
    private $firstField;
    private $secondField;

    public function __get($property) {
            if (property_exists($this, $property)) {
                return $this->$property;
            }
    }

    public function __set($property, $value) {
        if (property_exists($this, $property)) {
            $this->$property = $value;
        }
    }
}

$myClass = new MyClass();

$myClass->firstField = "This is a foo line";
$myClass->secondField = "This is a bar line";

echo $myClass->firstField;
echo $myClass->secondField;

/* Output:
    This is a foo line
    This is a bar line
 */

b)使用传统的setter和getter

class MyClass {

    private $firstField;
    private $secondField;

    public function getFirstField() {
        return $this->firstField;
    }

    public function setFirstField($firstField) {
        $this->firstField = $firstField;
    }

    public function getSecondField() {
        return $this->secondField;
    }

    public function setSecondField($secondField) {
        $this->secondField = $secondField;
    }

}

$myClass = new MyClass();

$myClass->setFirstField("This is a foo line");
$myClass->setSecondField("This is a bar line");

echo $myClass->getFirstField();
echo $myClass->getSecondField();

/* Output:
    This is a foo line
    This is a bar line
 */

本文内容:http://blog.webspecies.co.uk/2011-05-23/the-new-era-of-php-
frameworks.html

作者声称使用魔术方法不是一个好主意:

首先,那时使用PHP的魔术函数(get,
call等)非常流行。乍一看,它们没有什么错,但实际上它们确实很危险。它们使API不清楚,无法自动完成,最重要的是它们很慢。他们的用例是黑客PHP来做自己不想做的事情。而且有效。但不幸的事情发生了。

但我想听听有关此的更多意见。


问题答案:

过去我一直是您的情况。我去寻找魔术方法

这是一个错误,问题的最后一部分说明了一切:

  • (getters / setters)
  • 没有自动完成 (这是一个重大的问题,实际上),以及 式管理 由IDE的重构和代码浏览(在Zend Studio的/ PhpStorm这可能与处理@propertyPHPDoc的注解,但是需要保持他们:相当痛苦)
  • 文档 (phpdoc)与应该如何使用您的代码不匹配,并且查看您的类也不会带来太多答案。这很混乱。
  • 编辑后添加:具有属性的吸气剂 与“真实”方法更加一致, 在该 方法中getXXX()不仅返回私有属性,而且执行真实逻辑。您使用相同的命名。例如,您具有$user->getName()(返回私有属性)和$user->getToken($key)(计算出的)。当您的获取者获得的不仅仅是获取者并且需要做一些逻辑时,一切仍然是一致的。

最后,这是IMO的最大问题: 这是魔术
。魔术非常非常糟糕,因为您必须知道魔术如何工作才能正确使用它。这是我在团队中遇到的一个问题:每个人都必须了解魔术,而不仅仅是您。

getter和setter很难写(我讨厌他们),但是他们值得。



 类似资料:
  • 问题内容: 除非我完全误解,否则and 方法应该允许→ 和的重载。 例如,以下语句应调用该方法: 并且以下应使用该方法: 这在我的代码中不起作用,并且可以通过以下简单示例重现: 这只会导致: 在那儿放一些电话表明它根本没打。 现在,我只是说了一下要解决的问题,并在目前需要的地方手动使用它,但这不是很动态,并且需要知道“重载”代码实际上没有被调用,除非专门调用。我想知道这是否不是应该以我所理解的方式

  • PHP 是一门复杂的语言,经过多年折腾,使其不同版本之间高度不一致,有时还有些 bug。每个版本都有自己独有的特性、多余和怪异之处,也很难跟踪哪个版本有哪些问题。

  • 本文向大家介绍php 魔术方法详解,包括了php 魔术方法详解的使用技巧和注意事项,需要的朋友参考一下 从PHP 5以后的版本,PHP中的类就可以使用魔术方法了。其规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法。PHP 将所有以 _ _(两个下划线)开头的类方法保留为魔术方法。 __toString() 和__invoke()

  • 本文向大家介绍ThreadPoolExecutor 创建方法最佳实践?相关面试题,主要包含被问及ThreadPoolExecutor 创建方法最佳实践?时的应答技巧和注意事项,需要的朋友参考一下 在《阿里巴巴 Java 开发手册》“并发处理”这一章节,明确指出线程资源必须通过线程池提供,不允许在应用中自行显示创建线程。 为什么呢? 使用线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源开

  • 好的,所以我找不到关于这个主题的任何有用的材料,我找到的一大块文章中有一个方法是用@HystrixCommand注释的,并且定义了一个回退方法。 我找到的另一个解决方案是使用@DefaultProperties(defaultFallback=“fallbackMethod”),但问题是这些方法需要具有兼容的返回类型。 不幸的是,在我的服务中,我有许多具有完全不同签名的方法,我还需要掌握可抛出的方

  • 问题内容: 我正在尝试在PHP中创建类似CMS的系统。使它尽可能模块化和可扩展。 有人可以为我提供在PHP中创建事件侦听器系统(例如Drupal系统的非常简化的版本),创建钩子并在一个简短的示例中实现它们的最佳实践方案也很不错。 问题答案: 嗯,从实现角度看,确实有三种不同的方法可以做到这一点(请注意,这些是面向对象的设计模式,但是您可以根据需要在功能上或过程上实现它们)。 1.观察者模式 您可以