【问题标题】:Is there a better way to handle options being passed to a function in php?有没有更好的方法来处理传递给 php 函数的选项?
【发布时间】:2013-07-02 16:29:37
【问题描述】:

我需要将一组选项传递给一个函数。现在我正在做一些验证,以验证事情至少是有意义的。如果有更好的方法来做到这一点?事实上,对于最后 4 个选项,我想检查数组是否充满了字符串,而不仅仅是一个数组,但如果我能提供帮助,我不想循环遍历数组。

public function edit($id, $title, $options, $raw) {
    // Update options
    if (is_array($options)) {
        if (array_key_exists('showTitleDate', $options)) {
            if ($options['showTitleDate'] === true) { $this->showTitleDate = true; }
        }
        if (array_key_exists('showDetail', $options)) {
            if ($options['showDetail'] === true) { $this->showDetail = true; }
        }
        if (array_key_exists('showDetailDate', $options)) {
            if ($options['showDetailDate'] === true) { $this->showDetailDate = true; }
        }
        if (array_key_exists('showSubdetail', $options)) {
            if ($options['showSubdetail'] === true) { $this->showSubdetail = true; }
        }
        if (array_key_exists('showSubdetailDate', $options)) {
            if ($options['showSubdetailDate'] === true) { $this->showSubdetailDate = true; }
        }
        if (array_key_exists('showAdditional', $options)) {
            if ($options['showAdditional'] === true) { $this->showAdditional = true; }
        }
        if (array_key_exists('showTitleSelect', $options)) {
            if ($options['showTitleSelect'] === true) { $this->showTitleSelect = true; }
        }
        if (array_key_exists('showTopSelect', $options)) {
            if ($options['showTopSelect'] === true) { $this->showTopSelect = true; }
        }
        if (array_key_exists('showMiddleSelect', $options)) {
            if ($options['showMiddleSelect'] === true) { $this->showMiddleSelect = true; }
        }
        if (array_key_exists('showBottomSelect', $options)) {
            if ($options['showBottomSelect'] === true) { $this->showBottomSelect = true; }
        }
        if (array_key_exists('placeholderTitle', $options)) {
            if (is_string($options['placeholderTitle'])) { $this->placeholderTitle = $options['placeholderTitle']; }
        }
        if (array_key_exists('placeholderTitleDate', $options)) {
            if (is_string($options['placeholderTitleDate'])) { $this->placeholderTitleDate = $options['placeholderTitleDate']; }
        }
        if (array_key_exists('placeholderDetail', $options)) {
            if (is_string($options['placeholderDetail'])) { $this->placeholderDetail = $options['placeholderDetail']; }
        }
        if (array_key_exists('placeholderDetailDate', $options)) {
            if (is_string($options['placeholderDetailDate'])) { $this->placeholderDetailDate = $options['placeholderDetailDate']; }
        }
        if (array_key_exists('placeholderSubdetail', $options)) {
            if (is_string($options['placeholderSubdetail'])) { $this->placeholderSubdetail = $options['placeholderSubdetail']; }
        }
        if (array_key_exists('placeholderSubdetailDate', $options)) {
            if (is_string($options['placeholderSubdetailDate'])) { $this->placeholderSubdetailDate = $options['placeholderSubdetailDate']; }
        }
        if (array_key_exists('placeholderAdditional', $options)) {
            if (is_string($options['placeholderAdditional'])) { $this->placeholderAdditional = $options['placeholderAdditional']; }
        }
        if (array_key_exists('optionsTitleSelect', $options)) {
            if (is_array ($options['optionsTitleSelect'])) { $this->optionsTitleSelect = $options['optionsTitleSelect']; }
        }
        if (array_key_exists('optionsTopSelect', $options)) {
            if (is_array ($options['optionsTopSelect'])) { $this->optionsTopSelect = $options['optionsTopSelect']; }
        }
        if (array_key_exists('optionsMiddleSelect', $options)) {
            if (is_array ($options['optionsMiddleSelect'])) { $this->optionsMiddleSelect = $options['optionsMiddleSelect']; }
        }
        if (array_key_exists('optionsBottomSelect', $options)) {
            if (is_array ($options['optionsBottomSelect'])) { $this->optionsBottomSelect = $options['optionsBottomSelect']; }
        }
    }

    // -- logic code here
}

【问题讨论】:

标签: php options


【解决方案1】:

将所有可用选项映射到它们的验证功能。 我将标准函数包装为自己的函数的示例。

public function edit($id, $title, $options, $raw) {
    $isString = function($value) {
        return is_string($value);
    };
    $isArray = function($value) {
        return is_array($value);
    };
    $avaiableOptions = array(
        'placeholderTitleDate' => $isString,
        'optionsBottomSelect' => $isArray,
        ...
    );
    foreach ($options as $key => $val) {
        if (!array_key_exists($key, $availableOptions) {
            echo ... no such option - typo? available options are: ...
        } else {
            $validationFunc = $availableOptions[$key];
            if (!$validationFunc($options[$key])) {
                echo ... invalid value for option $key
            }
        }
    }

【讨论】:

    【解决方案2】:

    我的 php 生锈了,但我认为 "indirection" 可能会有所帮助:

    $all_key = array('showTitleDate', 'showDetail' /*, ... */);
    foreach ($all_key as $k)
        if (array_key_exists($k, $options) && $options[$k] === true) {
            $this->$k = true;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 2012-02-01
      • 2013-11-09
      相关资源
      最近更新 更多