不必要的 PHP 辅助程序/包装类


Unneccessary PHP helper/wrapper classes?

我最近开始深入研究Php类,我做的第一件事(我希望还不错)是构建各种辅助类,主要是静态的,用于我在每个中小型项目中所做的基本操作。例如,我有一个Session类,它具有简单的设置/获取/删除/闪存方法,因此我可以轻松地编写Session::set('logged', 1)。所以我有所有这些小类,我加载了spl_autoload_register.

这是我的第二个最重要的问题:为管理会话、cookie、输入、验证等琐碎操作构建类是否是一种不好的做法?

仅供参考,这是我的会话类的样子

class Session {

    /*
        check if $_SESSION is already started
    */
    public static function isStarted() {
        if ( php_sapi_name() !== 'cli' ) {
            if ( version_compare(phpversion(), '5.4.0', '>=') ) {
                return session_status() === PHP_SESSION_ACTIVE ? true : false;
            } else {
                return session_id() === '' ? false : true;
            }
        }
        return false;
    }

    /*
        check if a certain $_SESSION variable exists, e.g.: does $_SESSION['var'] exists ?
    */
    public static function exists($name) {
        if ( self::isStarted() ) {
            return isset($_SESSION[$name]);
        }
    }

    /*
        check if the $_SESSION global variable is empty, e.g.: is it an empty array ?
    */
    public static function isEmpty() {
        if ( self::isStarted() ) {
            return empty($_SESSION) ? true : false;
        }
    }

    /*
        call the session_start() function if it hasn't been already called
    */
    public static function start() {
        if ( !self::isStarted()) {
            session_start();
        }
    }

    /*
        regenerate session id
    */
    public static function regen() {
        if ( self::isStarted() ) {
            session_regenerate_id();
        }
    }

    /*
        set a new $_SESSION variable, e.g.: $_SESSION['var'] = 'value';
    */
    public static function set($name, $value) {
        if ( self::isStarted() ) {
            $_SESSION[$name] = $value;
        }
    }

    /*
        get the value for a certain $_SESSION variable, e.g.: return $_SESSION['var'];
        usage: Session::get('person.age'), Session::get('id'), Session::get('cart.id.qta')
    */
    public static function get($name) {
        $pieces = explode('.', $name);
        if ( count($pieces) <= 1 ) {
            return ( isset($_SESSION[$name]) ) ? $_SESSION[$name] : false;
        }
        $currentValue = false;
        for ($i = 0; $i < count($pieces); $i++) {
            if( !$currentValue ) {
                if ( !isset($_SESSION[$pieces[$i]]) ) return false;
                $currentValue = $_SESSION[$pieces[$i]];
            } else {
                if ( !isset( $currentValue[$pieces[$i]] ) ) return false;
                $currentValue = $currentValue[$pieces[$i]];
            }
        }
        return $currentValue;
    }

    /*
        delete a certain $_SESSION variable, e.g.: delete and unset $_SESSION['var'];
    */
    public static function delete($name) {
        if ( self::exists($name) ) {
            unset($_SESSION[$name]);
        }
    }

    /*
        delete all $_SESSION variables, e.g.: empty the $_SESSION global variable so it becomes an empty array
    */
    public static function deleteAll() {
        if ( self::isStarted() ) {
            session_unset();
        }
    }

    /*
        display the $_SESSION global variable in a formatted way
    */
    public static function show() {
        if ( !self::isStarted() ) {
            return dd($_SESSION);
        }
    }

    /*
        display a message one time, after refresh the message will be deleted
    */
    public static function flash($name, $message = '') {
        if ( self::exists($name) ) {
            $message = self::get($name);
            self::delete($name);
            return $message;
        } else {
            self::set($name, $message);
        }
        return false;
    }

    /*
        end and destroy the $_SESSION global variable
    */
    public static function end() {
        if ( self::isStarted() ) {
            $_SESSION = array();
            session_destroy();
            session_unset();
            setcookie(session_name(), '', time()-3600,'/', '', 0, 0);
        }
    }
}

主要问题是关于PDO的包装类。一开始我想构建一个singleton类,但由于我很容易受到他人的影响,所以我放弃了这个想法,我开始构建一个带有实例化的经典类。很快我发现,对于复杂的查询,构建这个类不会获得任何优势。为了证实我的想法,经过一番研究,我发现"专家"建议不要建立在已经友好用法PDO的基础上。

那么,你认为我可以忍受按原样编写PDO吗,为它构建一个类有什么真正的优势吗?我真的不介意为查询编写所有代码,我主要关心的是错误处理和所有try catch块。

谢谢。

编辑

我很抱歉问了两个问题,我不想再开另一个帖子。我唯一的问题是关于PDO课。请忽略第一个。

请注意,我对数据库执行基本操作,主要是 CRUD 操作,至少在不久的将来,我不会一次使用多个连接。

关于try catch,它被称为最终的PDO类,因为对我来说,错误处理是最困难的部分,所以我认为一个类会更好地处理它,而不是将所有语句包装在try catch块中。

事实上,你也不需要 try catch 块来处理错误。或者,更确切地说,您不应该以这种方式使用它。PHP足够聪明,可以更好地处理您的错误。

所以,最后一个论点也被打破了。

事实上,PDO几乎是基本查询的理想包装器。
从PDO创建一个合理的帮助程序类是一项极其艰巨的任务。因此,最好坚持使用原始PDO,至少对于初学者而言。

真的没有必要像使用 mysql 或 mysqli 包装器那样在 PDO 上构建。 PDO具有非常好的内置错误处理功能,当遇到问题时,您可以通过它提供的消息找到打嗝的位置。 现在,如果您一直在使用其中一个 mysql 包装器并且习惯了您一直在查看的自定义错误处理消息,那么您可以考虑将 PDO 包装在类中。

至于用于 SESSION 和 COOKIE 处理的类包装器,如果您喜欢的话,我认为在它们周围添加自己的类没有任何问题。 毕竟,大多数主要的MVC框架都提供了自己处理SESSIONS和COOKIES的方式。