我最近开始深入研究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
块中包装所有语句。
答案 0 :(得分:2)
事实上,您也不需要尝试使用catch块来进行错误处理。或者说,你不应该这样使用它。 PHP足够聪明,可以更好地处理错误。
所以,最后一个论点也被打破了。
事实上,PDO几乎是基本查询的理想包装器 从PDO中创建一个明智的帮助类是一项非常重要的任务。因此,最好坚持使用原始PDO,至少对于初学者而言。
答案 1 :(得分:1)
实际上没有必要像使用mysql或mysqli包装器一样构建PDO。 PDO具有非常好的内置错误处理功能,您可以通过它遇到问题时提供的消息找到打嗝的位置。现在,如果您一直在使用其中一个mysql包装器并习惯于您一直在查看的自定义错误处理消息,那么您可以考虑将PDO包装在一个类中。
就SESSION和COOKIE处理的类包装器而言,如果您喜欢这样,我认为在它们周围添加自己的类没有任何问题。毕竟,大多数主要的MVC框架都提供了自己处理SESSIONS和COOKIES的方式。