매우 간단한 PHPMVC

WBOY
풀어 주다: 2016-07-25 08:47:44
원래의
1704명이 탐색했습니다.
기본 PHP 구문을 사용하여 페이지를 렌더링하고 위젯 기능을 제공합니다.
  1. /**
  2. * 구성 매개변수 가져오기 및 설정은 일괄 정의를 지원합니다
  3. * $key가 연관 배열인 경우 구성은 K-V 형식으로 작성됩니다.
  4. * $key가 숫자 인덱스 배열인 경우 해당 구성은 반환됩니다 Array
  5. * @param string|array $key 구성 변수
  6. * @param array|null $value 구성 값
  7. * @return array|null
  8. */
  9. 함수 C($key,$value=null){
  10. 정적 $_config = 배열 ();
  11. $args = func_num_args();
  12. if($args == 1){
  13. if(is_string($key)){ //수신 키가 문자열인 경우
  14. return isset($_config[$key])?$_config[$key]:null;
  15. }
  16. if(is_array($key)){
  17. if(array_keys($key) !== 범위( 0, count($key) - 1)){ //수신 키가 연관 배열인 경우
  18. $_config = array_merge($_config, $key);
  19. }else{
  20. $ret = array ();
  21. foreach ($key를 $k로) {
  22. $ret[$k] = isset($_config[$k])?$_config[$k]:null;
  23. }
  24. return $ret;
  25. }
  26. }
  27. }else{
  28. if(is_string($key)){
  29. $_config[$key] = $value;
  30. }else {
  31. halt('전달된 매개변수가 올바르지 않습니다.');
  32. }
  33. }
  34. return null;
  35. }
  36. /**
  37. * 위젯 호출
  38. * @param string $name 위젯 이름
  39. * @param array $data 위젯에 전달된 변수 목록, 키는 변수 이름, 값은 변수 값
  40. * @return void
  41. */
  42. function W( $name, $data = array()){
  43. $fullName = $name.'Widget';
  44. if(!class_exists($fullName)){
  45. halt('Widget '.$name.' 존재하지 않음');
  46. }
  47. $widget = new $fullName();
  48. $widget->invoke($data);
  49. }
  50. /**
  51. * 프로그램 실행 종료
  52. * @param string $str 종료 이유
  53. * @param bool $display 콜 스택 표시 여부, 기본적으로 표시되지 않음
  54. * @return void
  55. * /
  56. function quit($str, $display=false){
  57. Log::fatal($str.' debug_backtrace:'.var_export(debug_backtrace(), true));
  58. header("Content- :text/html; charset=utf-8");
  59. if($display){
  60. echo "
    ";
  61. debug_print_backtrace();
  62. echo "}
  63. echo $str;
  64. exit;
  65. }
  66. /**
  67. * 데이터베이스 인스턴스 가져오기
  68. * @return DB
  69. */
  70. function M(){
  71. $dbConf = C( 배열('DB_HOST','DB_PORT','DB_USER','DB_PWD','DB_NAME','DB_CHARSET'));
  72. return DB::getInstance($dbConf);
  73. }
  74. /* *
  75. * 파일이 존재하는 경우 포함
  76. * @param string $path 파일 경로
  77. * @return void
  78. */
  79. 함수 includeIfExist($path){
  80. if(file_exists($path)){
  81. include $path;
  82. }
  83. }
  84. /**
  85. * 일반 제어 카테고리
  86. */
  87. class SinglePHP {
  88. /**
  89. * 컨트롤러
  90. * @var 문자열
  91. */
  92. private $c;
  93. /**
  94. * 액션
  95. * @var 문자열
  96. */
  97. private $a;
  98. / * *
  99. * 싱글톤
  100. * @var SinglePHP
  101. */
  102. 비공개 정적 $_instance;
  103. /**
  104. * 생성자, 초기화 구성
  105. * @param array $conf
  106. */
  107. 비공개 함수 __construct($conf){
  108. C($conf);
  109. }
  110. 비공개 함수 __clone(){}
  111. /**
  112. * 단일 인스턴스 가져오기
  113. * @param array $conf
  114. * @return SinglePHP
  115. */
  116. 공용 정적 함수 getInstance($conf){
  117. if(!(self::$_instance instanceof self)){
  118. self::$_instance = new self($conf);
  119. }
  120. return self::$_instance;
  121. }
  122. /**
  123. * 애플리케이션 인스턴스 실행
  124. * @access public
  125. * @return void
  126. */
  127. 공개 함수 실행(){
  128. if(C('USE_SESSION') == true){
  129. session_start();
  130. }
  131. C('APP_FULL_PATH', getcwd().'/'.C( ' APP_PATH').'/');
  132. includeIfExist( C('APP_FULL_PATH').'/common.php');
  133. $pathMod = C('PATH_MOD');
  134. $pathMod = 비어 있음 ( $pathMod)?'NORMAL':$pathMod;
  135. spl_autoload_register(array('SinglePHP', 'autoload'));
  136. if(strcmp(strtoupper($pathMod),'NORMAL') === 0 | !isset($_SERVER['PATH_INFO'])){
  137. $this->c = isset($_GET['c'])?$_GET['c']:'색인';
  138. $this->a = isset($_GET['a'])?$_GET['a']:'Index';
  139. }else{
  140. $pathInfo = isset($_SERVER['PATH_INFO ' ])?$_SERVER['PATH_INFO']:'';
  141. $pathInfoArr =explod('/',trim($pathInfo,'/'));
  142. if(isset($pathInfoArr[0] ) && $pathInfoArr[0] !== ''){
  143. $this->c = $pathInfoArr[0];
  144. }else{
  145. $this->c = '색인';
  146. }
  147. if(isset($pathInfoArr[1])){
  148. $this->a = $pathInfoArr[1];
  149. }else{
  150. $this->a = '색인';
  151. }
  152. }
  153. if(!class_exists($this->c.'Controller')){
  154. halt('Controller'.$this->c. '존재하지 않습니다');
  155. }
  156. $controllerClass = $this->c.'Controller';
  157. $controller = new $controllerClass();
  158. if(!method_exists($controller , $this->a.'Action')){
  159. halt('Method'.$this->a.'존재하지 않습니다');
  160. }
  161. call_user_func(array($controller ,$ this->a.'Action'));
  162. }
  163. /**
  164. * 자동 로딩 기능
  165. * @param string $class 클래스명
  166. */
  167. 공용 정적 함수 autoload($class){
  168. if(substr($class ,- 10)=='컨트롤러'){
  169. includeIfExist(C('APP_FULL_PATH').'/Controller/'.$class.'.class.php');
  170. }elseif(substr($class ,- 6)=='위젯'){
  171. includeIfExist(C('APP_FULL_PATH').'/Widget/'.$class.'.class.php');
  172. }else{
  173. includeIfExist(C('APP_FULL_PATH').'/Lib/'.$class.'.class.php');
  174. }
  175. }
  176. }
  177. /**
  178. * 컨트롤러 클래스
  179. */
  180. 클래스 컨트롤러 {
  181. /**
  182. * 인스턴스 보기
  183. * @var 보기
  184. */
  185. private $_view;
  186. /**
  187. * 생성자, 뷰 인스턴스 초기화, 후크 호출
  188. */
  189. public 함수 __construct(){
  190. $this->_view = new View();
  191. $this->_init();
  192. }
  193. /**
  194. * 프리훅
  195. */
  196. 보호된 함수 _init(){}
  197. /**
  198. * 템플릿 렌더링 및 출력
  199. * @param null|string $tpl 템플릿 파일 경로
  200. * 매개변수는 앱/뷰/파일에 대한 상대 경로이며 다음과 같은 접미사 이름을 포함하지 않습니다. index/index
  201. * 매개변수가 비어 있는 경우 기본값은 $controller/$action.php
  202. * 매개변수에 "/"가 포함되어 있지 않으면 기본값은 $controller/$tpl
  203. * @ 무효 반환
  204. */
  205. 보호된 함수 표시($tpl=''){
  206. if($tpl === ''){
  207. $trace = debug_backtrace();
  208. $controller = substr($trace[1]['class'], 0, -10);
  209. $action = substr($trace[1]['function'], 0 , -6);
  210. $tpl = $컨트롤러 . '/' . $action;
  211. }elseif(strpos($tpl, '/') === false){
  212. $trace = debug_backtrace();
  213. $controller = substr($trace[1]['class '], 0, -10);
  214. $tpl = $controller . '/' . $tpl;
  215. }
  216. $this->_view->display($tpl);
  217. }
  218. /**
  219. * 뷰 엔진에 대한 템플릿 변수 설정
  220. * @param string $name 템플릿에서 사용할 변수 이름
  221. * @param mix $value 템플릿의 변수 이름에 해당하는 값
  222. * @ 반환 무효
  223. */
  224. 보호된 함수 할당($name, $value){
  225. $this->_view->할당($name,$value);
  226. }
  227. /**
  228. * 데이터를 json 형식으로 브라우저에 출력하고 코드 실행을 중지합니다
  229. * @param array $data 출력할 데이터
  230. */
  231. 보호된 함수 ajaxReturn($data) {
  232. echo json_encode($data);
  233. exit;
  234. }
  235. /**
  236. * 지정된 URL로 리디렉션
  237. * @param string $url 리디렉션할 URL
  238. * @param void
  239. */
  240. 보호된 함수 리디렉션($url){
  241. header("위치: $url");
  242. exit;
  243. }
  244. }
  245. /**
  246. * 수업 보기
  247. */
  248. 클래스 보기 {
  249. /**
  250. * 파일 디렉터리 보기
  251. * @var string
  252. */
  253. 비공개 $_tplDir;
  254. /**
  255. * 파일 경로 보기
  256. * @var string
  257. */
  258. 비공개 $_viewPath;
  259. /**
  260. * 변수 목록 보기
  261. * @var array
  262. */
  263. 비공개 $_data = array();
  264. /**
  265. * tplInclude용 변수 목록
  266. * @var array
  267. */
  268. 비공개 정적 $tmpData;
  269. /**
  270. * @param 문자열 $tplDir
  271. */
  272. 공용 함수 __construct($tplDir=''){
  273. if($tplDir == ''){
  274. $this->_tplDir = './'.C('APP_PATH').'/View/';
  275. }else{
  276. $this->_tplDir = $tplDir;
  277. }
  278. }
  279. /**
  280. * 뷰 엔진에 대한 템플릿 변수 설정
  281. * @param string $key 템플릿에서 사용할 변수 이름
  282. * @param mix $value 템플릿의 변수 이름에 해당하는 값
  283. * @ 반환 무효
  284. */
  285. 공용 함수 할당($key, $value) {
  286. $this->_data[$key] = $value;
  287. }
  288. /**
  289. * 템플릿 렌더링 및 출력
  290. * @param null|string $tplFile 앱/뷰/파일을 기준으로 한 템플릿 파일 경로에는 인덱스/인덱스와 같은 접미사 이름이 포함되지 않습니다.
  291. * @return void
  292. */
  293. 공용 함수 표시($tplFile) {
  294. $this->_viewPath = $this->_tplDir . $tpl파일 . '.php';
  295. unset($tplFile);
  296. extract($this->_data);
  297. include $this->_viewPath;
  298. }
  299. /**
  300. * 템플릿 파일에 다른 템플릿을 포함하는 데 사용됩니다.
  301. * @param string $path View 디렉터리에 대한 상대 경로
  302. * @param array $data 하위 템플릿에 전달되는 변수 목록, 키 은 변수 이름이고, value는 변수 값입니다
  303. * @return void
  304. */
  305. 공용 정적 함수 tplInclude($path, $data=array()){
  306. self::$tmpData = array(
  307. 'path' => C('APP_FULL_PATH') .' /보기/' . $path . '.php',
  308. 'data' => $data,
  309. );
  310. unset($path);
  311. unset($data);
  312. extract(self::$tmpData['data']);
  313. include self::$tmpData['path'];
  314. }
  315. }
  316. /**
  317. * 위젯 클래스
  318. * 사용 시 이 클래스를 상속받아서 Invoke 메소드를 오버라이드하고, Invoke 메소드에서 display
  319. 를 호출해야 합니다.*/
  320. 클래스 위젯 {
  321. /**
  322. * 인스턴스 보기
  323. * @var 보기
  324. */
  325. protected $_view;
  326. /**
  327. * 위젯명
  328. * @var string
  329. */
  330. protected $_widgetName;
  331. /**
  332. * 생성자, 뷰 인스턴스 초기화
  333. */
  334. 공용 함수 __construct(){
  335. $this->_widgetName = get_class($this);
  336. $dir = C('APP_FULL_PATH') . '/Widget/Tpl/';
  337. $this->_view = new View($dir);
  338. }
  339. /**
  340. * 처리 로직
  341. * @param 혼합 $data 매개변수
  342. */
  343. 공용 함수 호출($data) {}
  344. /**
  345. * 렌더 템플릿
  346. * @param string $tpl 템플릿 경로, 비어 있으면 클래스 이름을 템플릿 이름으로 사용
  347. */
  348. 보호된 함수 표시($tpl=''){
  349. if($tpl == ''){
  350. $tpl = $this-> ;_widgetName;
  351. }
  352. $this->_view->display($tpl);
  353. }
  354. /**
  355. * 뷰 엔진에 대한 템플릿 변수 설정
  356. * @param string $name 템플릿에서 사용할 변수 이름
  357. * @param mix $value 템플릿의 변수 이름에 해당하는 값
  358. * @ 반환 무효
  359. */
  360. 보호된 함수 할당($name, $value){
  361. $this->_view->할당($name,$value);
  362. }
  363. }
  364. /**
  365. * 데이터베이스 작업 클래스
  366. * 사용 방법:
  367. * DB::getInstance($conf)->query('select * from table');
  368. * 여기서 $conf는 연관 배열입니다. , 다음 키를 포함해야 합니다:
  369. * DB_HOST DB_USER DB_PWD DB_NAME
  370. * DB_PORT 및 DB_CHARSET을 사용하여 포트와 인코딩을 지정할 수 있으며 기본값은 3306 및 utf8입니다
  371. */
  372. 클래스 DB {
  373. /**
  374. * 데이터베이스 링크
  375. * @var 리소스
  376. */
  377. 비공개 $_db;
  378. /**
  379. * 마지막 sql 저장
  380. * @var string
  381. */
  382. 비공개 $_lastSql;
  383. /**
  384. * 마지막 SQL 문의 영향을 받은 행 수
  385. * @var int
  386. */
  387. 비공개 $_rows;
  388. /**
  389. * 마지막 SQL 실행 오류
  390. * @var string
  391. */
  392. 비공개 $_error;
  393. /**
  394. * 인스턴스 배열
  395. * @var 배열
  396. */
  397. 비공개 정적 $_instance = array();
  398. /**
  399. * 생성자
  400. * @param array $dbConf 구성 배열
  401. */
  402. 비공개 함수 __construct($dbConf){
  403. if(!isset($dbConf['DB_CHARSET']) ){
  404. $dbConf['DB_CHARSET'] = 'utf8';
  405. }
  406. $this->_db = mysql_connect($dbConf['DB_HOST'].':'.$dbConf['DB_PORT '],$dbConf['DB_USER'],$dbConf['DB_PWD']);
  407. if($this->_db === false){
  408. halt(mysql_error());
  409. }
  410. $selectDb = mysql_select_db($dbConf['DB_NAME'],$this->_db);
  411. if($selectDb === false){
  412. halt(mysql_error());
  413. }
  414. mysql_set_charset($dbConf['DB_CHARSET']);
  415. }
  416. 비공개 함수 __clone(){}
  417. /**
  418. * DB 클래스 가져오기
  419. * @param array $dbConf 구성 배열
  420. * @return DB
  421. */
  422. 정적 공개 함수 getInstance($ dbConf){
  423. if(!isset($dbConf['DB_PORT'])){
  424. $dbConf['DB_PORT'] = '3306';
  425. }
  426. $key = $dbConf[' DB_HOST'].':'.$dbConf['DB_PORT'];
  427. if(!isset(self::$_instance[$key]) || !(self::$_instance[$key] self) ){
  428. self::$_instance[$key] = new self($dbConf);
  429. }
  430. return self::$_instance[$key];
  431. }
  432. /**
  433. * 이스케이프된 문자열
  434. * @param string $str 이스케이프할 문자열
  435. * @return string 이스케이프된 문자열
  436. */
  437. 공용 함수 escape($str){
  438. return mysql_real_escape_string($str, $this->_db);
  439. }
  440. /**
  441. * select 문에 사용되는 쿼리
  442. * @param string $sql 쿼리할 sql
  443. * @return bool|array 쿼리가 성공하면 해당 배열을 반환하고, 실패하면 해당 배열을 반환하고, 거짓
  444. */
  445. 공용 함수 쿼리($sql){
  446. $this->_rows = 0;
  447. $this->_error = '';
  448. $this->_lastSql = $sql;
  449. $this->logSql();
  450. $res = mysql_query($sql,$this->_db);
  451. if($res === false){
  452. $this->_error = mysql_error($this->_db);
  453. $this->logError();
  454. false 반환;
  455. }else{
  456. $this->_rows = mysql_num_rows($res) ;
  457. $result = array();
  458. if($this->_rows >0) {
  459. while($row = mysql_fetch_array($res, MYSQL_ASSOC)){
  460. $result[ ] = $row;
  461. }
  462. mysql_data_seek($res,0);
  463. }
  464. return $result;
  465. }
  466. }
  467. /**
  468. * 삽입/업데이트/삭제 문에 사용되는 쿼리
  469. * @param string $sql 쿼리할 SQL
  470. * @return bool|int 쿼리가 성공하면 영향을 받은 레코드 수를 반환하고, 실패하면 false를 반환합니다
  471. */
  472. 공용 함수 실행($sql) {
  473. $this->_rows = 0;
  474. $this->_error = '';
  475. $this->_lastSql = $sql;
  476. $this->logSql();
  477. $result = mysql_query($sql, $this->_db) ;
  478. if ( false === $result) {
  479. $this-> ;_error = mysql_error($this->_db);
  480. $this->logError();
  481. false 반환;
  482. } else {
  483. $this->_rows = mysql_affected_rows($ this->_db);
  484. return $this->_rows;
  485. }
  486. }
  487. /**
  488. * 마지막 쿼리의 영향을 받은 레코드 수 가져오기
  489. * @return int 영향을 받은 레코드 수
  490. */
  491. 공용 함수 getRows(){
  492. return $this->_rows;
  493. }
  494. /**
  495. * 마지막 삽입 이후 생성된 자동 증가 ID 가져오기
  496. * @return int 자동 증가 ID
  497. */
  498. 공개 함수 getInsertId() {
  499. return mysql_insert_id($this->_db);
  500. }
  501. /**
  502. * 마지막 쿼리의 sql 가져오기
  503. * @return string sql
  504. */
  505. 공용 함수 getLastSql(){
  506. return $this->_lastSql;
  507. }
  508. /**
  509. * 마지막 쿼리의 오류 정보 가져오기
  510. * @return 문자열 오류 정보
  511. */
  512. 공용 함수 getError(){
  513. return $this->_error;
  514. }
  515. /**
  516. * SQL을 파일에 기록
  517. */
  518. 비공개 함수 logSql(){
  519. Log::sql($this- >_lastSql);
  520. }
  521. /**
  522. * 오류 로그를 파일에 기록
  523. */
  524. 비공개 함수 logError(){
  525. $str = '[SQL ERR]'.$this->_error.' SQL:'.$this->_lastSql;
  526. 로그::warn($str);
  527. }
  528. }
  529. /**
  530. * 로그 클래스
  531. * 사용 방법: Log::fatal('error msg');
  532. * 저장 경로는 App/Log, 날짜별로 저장됩니다.
  533. * Fatal 및 warning은 에 기록됩니다. .wf 파일의 .log
  534. */
  535. 클래스 로그{
  536. /**
  537. * 로그, SAE 환경 지원
  538. * @param string $msg 로그 내용
  539. * @param string $level 로그 수준
  540. * @param bool $wf 오류 로그 여부
  541. */
  542. 공용 정적 함수 write($msg, $level='DEBUG', $wf=false){
  543. if(function_exists('sae_debug')){ //如果是SAE, 则使用sae_debug函数打日志
  544. $msg = "[{$level}]".$msg;
  545. sae_set_display_errors(false);
  546. sae_debug(trim($msg));
  547. sae_set_display_errors (참);
  548. }else{
  549. $msg = date('[ Y-m-d H:i:s ]')."[{$level}]".$msg."rn";
  550. $logPath = C('APP_FULL_PATH').'/Log/'.date('Ymd').'.log';
  551. if($wf){
  552. $logPath .= '.wf';
  553. }
  554. file_put_contents($logPath, $msg, FILE_APPEND);
  555. }
  556. }
  557. /**
  558. * 列印fatal日誌
  559. * @param string $msg 日誌資訊
  560. */
  561. 公用靜態函數fatal($msg){
  562. self::write($msg, 'FATAL', true);
  563. }
  564. /**
  565. * 列印warning日誌
  566. * @param string $msg 日誌資訊
  567. */
  568. 公用靜態函數warn($msg){
  569. self::write($msg, 'WARN', true);
  570. }
  571. /**
  572. * 列印notice日誌
  573. * @param string $msg 日誌資訊
  574. */
  575. 公共靜態函數通知($msg) {
  576. self::write($msg, '注意');
  577. }
  578. /**
  579. * 列印debug日誌
  580. * @param string $msg 日誌資訊
  581. */
  582. 公用靜態函式debug($msg){
  583. self:: write($msg, 'DEBUG');
  584. }
  585. /**
  586. * 列印sql日誌
  587. * @param string $msg 日誌資訊
  588. */
  589. 公用靜態函數sql($msg){
  590. self::write($msg, 'SQL ');
  591. }
  592. }
  593. /**
  594. * ExtException類,記錄額外的異常資訊
  595. */
  596. class ExtException extends Exception{
  597. /**
  598. * @var 陣列
  599. */
  600. protected $extra;/**
  601. * @param string $message
  602. * @param array $extra
  603. * @param int $code
  604. * @param null $previous
  605. */
  606. public function __construct($message = "", $extra = array(), $code = 0, $previous = null){
  607. $this->extra = $ extra;
  608. parent::__construct($message, $code, $previous);
  609. }
  610. /**
  611. * 取得額外的異常資訊
  612. * @return array
  613. */
  614. public function getExtra(){
  615. return $this this this ->extra;
  616. }
  617. }
複製程式碼


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿