0

我最近开始深入研究 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块中更好地处理它。

4

2 回答 2

2

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

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

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

于 2013-11-03T19:45:03.917 回答
1

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

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

于 2013-11-03T19:57:19.750 回答