【问题标题】:Are these class properties redundant?这些类属性是多余的吗?
【发布时间】:2012-01-01 22:49:23
【问题描述】:

这是我正在学习的课程。使用表单上传文件后,它会发布到包含此类的 php 文件:

class Parse
{
    public $file;

    public function __construct()
    {
        echo 'The class was initiated!<br />';
    }

    public function setFile($file) 
    {
        if (sizeof($file) == 1)
        {
            $this->file = $file;
        }
    }

    public function getFileName()
    {
        return $this->file['uploadedfile']['name'];
    }

    public function getFileTempName()
    {
        return $this->file['uploadedfile']['tmp_name'];
    }

    public function getFileSize()
    {
        return $this->file['uploadedfile']['size'];
    }
}

我应该像创建 Getter 一样直接引用 $obj->file['uploadedfile']['property'],还是应该创建一堆像 public $filename 这样的公共类属性并存储来自 $ _FILES 变量转换成单独的类属性?

最佳实践是什么?

已编辑答案

这段代码完美运行:

<?php

    class Parser
    {
        public $file;

        public function __construct()
        {
            echo 'The class was initiated!<br />';
        }

        public function setFile($file) 
        {
            if ($_POST) {
                if ($file['uploadedfile']['size'] > 0) {
                    $this->file = $file;
                } else {
                    echo "File not uploaded!<br />";
                }
            } else {
                echo "The form was not submitted!<br />";
            }
        }
    }

    ################
    # test area
    ################



    $obj = new LoLParser;
    $obj->setFile($_FILES);

    ?>

【问题讨论】:

    标签: php class properties


    【解决方案1】:

    鉴于$_FILES 是一个超全局变量,在所有范围内都可用,您并没有真正获得任何东西,将其存储为类属性可以获得一些特别小的收益。将它作为一个属性保存在类中以提高可读性可能会有一些好处。正如 cmets 中所指出的,它还提供了一种模拟数据以进行单元测试的途径。

    但是,在我看来,为$_FILES 创建 getter 方法似乎增加了不必要的复杂性和混乱。 Getter 对于在类之外公开私有或受保护的属性很有用,但在访问超全局时几乎没有用处,因为无论如何您都无法保护超全局的内容。

    【讨论】:

    • 通过将行为包装在一个类中,您确实获得了两个潜在的(相关的)好处:这现在是可注入的和可模拟的。
    • @OliCharlesworth 我同意 mockable,但仍然看不到注入超全局变量的目的。
    • 嗯,它消除了以前直接访问超全局的依赖。
    • 太棒了,感谢您的富有洞察力的回答。这是一种可以接受的方式来判断文件是否已上传?:if ($_POST) { if ($file['uploadedfile']['name'] != "") { $this-&gt;file = $file; } else { echo "No file uploaded!&lt;br /&gt;"; } } else { echo "NO POST!&lt;br /&gt;"; } 我注意到 $_FILES 永远不会返回空,即使您在提交表单之前没有浏览到文件。这是检查的正确方法吗?这提供了正确的结果,只是不确定是否是最佳实践:)
    • @pr0tocol 我可能只使用!empty($file['uploadedfile']['name'])$_FILES['uploadedfile']['size'] &gt; 0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2013-04-11
    相关资源
    最近更新 更多