不必要的PHP助手/包装类?

时间:2013-11-03 19:40:47

标签: php class pdo wrapper helper

我最近开始深入研究Php类,第一件事(我希望不错)我做的是构建各种辅助类,大多数是静态的,用于我在每个中小项目中执行的基本操作。例如,我有一个Session类,它有简单的set / get / delete / flash方法,所以我可以轻松编写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块中包装所有语句。

2 个答案:

答案 0 :(得分:2)

事实上,您也不需要尝试使用catch块来进行错误处理。或者说,你不应该这样使用它。 PHP足够聪明,可以更好地处理错误。

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

事实上,PDO几乎是基本查询的理想包装器 从PDO中创建一个明智的帮助类是一项非常重要的任务。因此,最好坚持使用原始PDO,至少对于初学者而言。

答案 1 :(得分:1)

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

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