1 <?php
2 /**
3 +------------------------------------------------------------+
4 代码调试快捷函数
5 @author: 相望成伤(zbseoag)
6
7 Debug::p(1,2,3);
8 Debug::log(1, 2, 3);
9 +------------------------------------------------------------+
10 */
11
12 class Debug {
13
14 //日志文件
15 public static $file = '';
16
17 /**
18 * 设置日志文件路径
19 * @param string $file
20 * @return mixed|string
21 */
22 public static function file($file = ''){
23
24 self::$file = empty($file)? sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'debug.txt' : str_replace('\\', DIRECTORY_SEPARATOR, $file);
25 return self::$file;
26 }
27
28 /**
29 * 格式化数据
30 * @param $data
31 * @return string
32 */
33 public static function format($data){
34
35 if(in_array($data, array('TRUE','true', 'false', 'FALSE', 'null', 'NULL'), true )) $data = "'$data'";
36 if(is_bool($data)) $data = $data? 'true' : 'false';
37 if(is_null($data)) $data = 'null';
38 if($data === '') $data = "''";
39
40 if($data instanceof \think\Model){ $data->__last_sql__ = $data->getLastSql(); $data = $data->getData();}
41 if(is_array($data) && current($data) instanceof \think\Model){ $data = collection($data)->toArray();}
42
43 if(is_string($data)) $data = self::unicode($data);
44
45 $output = array();
46
47 if(is_string($data) && function_exists($data)){
48
49 $object = new \ReflectionFunction($data);
50 $output['========== FUNC =========='] = array('Function' => $data, 'Namespace' => $object->getNamespaceName(), 'File' => $object->getFilename());
51 }
52
53 if(is_object($data) || (is_string($data) && class_exists($data, false))){
54
55 $message = '';
56 if(is_object($data)){
57
58 if($data instanceof \Exception){
59
60 $file = $data->getFile() . ' (' .$data->getLine() .')';
61 $message = $data->getMessage() . ' (' .$data->getCode() .')';
62 }
63
64 $name = get_class($data);
65 $fields = get_object_vars($data);
66
67 }else{
68 $name = $data;
69 $fields = get_class_vars($data);
70 }
71
72 $methods = get_class_methods($data);
73
74 $object = new \ReflectionClass($data);
75 if(!isset($file)) $file = $object->getFilename();
76
77 $output['========== CLASS =========='] = array('Class' => $name, 'Namespace' => $object->getNamespaceName(), 'Message' => $message, 'File' => $file, 'Attr' => $fields, 'Method' => $methods);
78
79 }
80
81 if(count($output) == 1) $output = current($output);
82 return empty($output)? $data : $output;
83 }
84
85 /**
86 * 打印当前输入数据
87 *
88 */
89 public static function input(){
90
91 self::p('$GLOBALS:', $GLOBALS);
92 self::p('php://input:', file_get_contents('php://input'));
93
94 }
95
96 /**
97 * unicode 编码
98 * @param $string
99 * @return string|string[]|null
100 */
101 public static function unicode($string) {
102
103 return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', function($match){
104 return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
105 }, $string);
106
107 }
108
109 /**
110 * 打印数据
111 * $args 参数列表
112 */
113 public static function p($args = ''){
114
115 $args = func_get_args();
116 $count = func_num_args();
117 if($count == 0) $args = array();
118
119 $cli = isset($argc);
120 $output = $cli? '' : '<pre style="background:#f3f3f4;padding:5px;border:1px solid #aaa;">' ;
121 foreach($args as $key => $data){
122 $data = self::format($data);
123 $output .= print_r($data, true);
124
125 if($key < $count - 1) $output .= $cli? "\r\n--------------------------------------------------------\r\n" : '<hr/>';
126 }
127
128 $output .= $cli? "\r\n" : '</pre>';
129 echo $output;
130
131 }
132
133
134 public static function stop(){
135
136 call_user_func_array(array('Debug', 'p'), func_get_args());
137 exit;
138 }
139
140
141 /**
142 * 浏览器控制台打印数据
143 */
144 public static function console(){
145
146 $output = '';
147 $args = func_get_args();
148 foreach($args as $key => $data) $output .= self::format($data);
149
150 echo '<script>console.log("';
151 echo preg_replace('/\r|\n/', '', $output);
152 echo '")</script>';
153
154 }
155
156
157 /**
158 * 写入格式化的日志内容
159 */
160 public static function log($args = ''){
161
162 $args = func_get_args();
163 $count = func_num_args();
164
165 self::file();
166 foreach($args as $key => $data){
167
168 $data = self::format($data);
169 if(!is_string($data)){
170 $data = var_export($data, true);
171 $data = preg_replace(array('/(=>)(\s+)\n\s+(array)/'), array('\1\2\3'), $data);
172 }
173
174 file_put_contents(self::$file, $data, FILE_APPEND | LOCK_EX);
175 if($key < $count - 1) file_put_contents(self::$file, "\n----------------------------------------------------------------------------\n", FILE_APPEND | LOCK_EX);
176
177 }
178
179 file_put_contents(self::$file, "\n==================================================[time ".date('Y-m-d H:i:s')."]==================================================\n", FILE_APPEND | LOCK_EX);
180 }
181
182
183 /**
184 * 写文件
185 */
186 public static function write($args = ''){
187
188 $args = func_get_args();
189 if(empty(self::$file)) self::file();
190
191 foreach($args as $key => $data){
192 file_put_contents(self::$file, (is_string($data)? $data : var_export($data, true)), FILE_APPEND | LOCK_EX);
193 }
194
195 }
196
197 /**
198 * 读取文件内容
199 */
200 public static function read($file = ''){
201
202 if(empty($file)) $file = self::$file;
203 self::p('调试文件:', file_get_contents($file));
204 }
205
206 /**
207 * 清空日志文件
208 */
209 public static function clear(){
210
211 self::file();
212 file_put_contents(self::$file, '',LOCK_EX);
213 }
214
215
216
217 }
218
219
220 function p($args = '-here-'){
221
222 call_user_func_array(array('Debug', 'p'), func_get_args());
223 }