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