1
|
|
|
<?php |
2
|
|
|
/* Copyright (C) NAVER <http://www.navercorp.com> */ |
3
|
|
|
require_once(_XE_PATH_.'modules/document/document.item.php'); |
4
|
|
|
|
5
|
|
|
/** |
6
|
|
|
* document class |
7
|
|
|
* @brief document the module's high class |
8
|
|
|
* {@internal Silently adds one extra Foo to compensate for lack of Foo } |
9
|
|
|
* |
10
|
|
|
* @author NAVER ([email protected]) |
11
|
|
|
* @package /modules/document |
12
|
|
|
* @version 0.1 |
13
|
|
|
*/ |
14
|
|
|
class document extends ModuleObject |
15
|
|
|
{ |
16
|
|
|
/** |
17
|
|
|
* Search option to use in admin page |
18
|
|
|
* @var array |
19
|
|
|
*/ |
20
|
|
|
var $search_option = array('title','content','title_content','user_name',); // /< Search options |
21
|
|
|
/** |
22
|
|
|
* Status list |
23
|
|
|
* @var array |
24
|
|
|
*/ |
25
|
|
|
var $statusList = array('private'=>'PRIVATE', 'public'=>'PUBLIC', 'secret'=>'SECRET', 'temp'=>'TEMP'); |
26
|
|
|
|
27
|
|
|
/** |
28
|
|
|
* Implement if additional tasks are necessary when installing |
29
|
|
|
* @return Object |
30
|
|
|
*/ |
31
|
|
|
function moduleInstall() |
32
|
|
|
{ |
33
|
|
|
// Register action forward (to use in administrator mode) |
34
|
|
|
$oModuleController = getController('module'); |
35
|
|
|
|
36
|
|
|
$oDB = &DB::getInstance(); |
37
|
|
|
$oDB->addIndex("documents","idx_module_list_order", array("module_srl","list_order")); |
38
|
|
|
$oDB->addIndex("documents","idx_module_update_order", array("module_srl","update_order")); |
39
|
|
|
$oDB->addIndex("documents","idx_module_readed_count", array("module_srl","readed_count")); |
40
|
|
|
$oDB->addIndex("documents","idx_module_voted_count", array("module_srl","voted_count")); |
41
|
|
|
$oDB->addIndex("documents","idx_module_notice", array("module_srl","is_notice")); |
42
|
|
|
$oDB->addIndex("documents","idx_module_document_srl", array("module_srl","document_srl")); |
43
|
|
|
$oDB->addIndex("documents","idx_module_blamed_count", array("module_srl","blamed_count")); |
44
|
|
|
$oDB->addIndex("document_aliases", "idx_module_title", array("module_srl","alias_title"), true); |
45
|
|
|
$oDB->addIndex("document_extra_vars", "unique_extra_vars", array("module_srl","document_srl","var_idx","lang_code"), true); |
46
|
|
|
// 2007. 10. 17 Add a trigger to delete all posts together when the module is deleted |
47
|
|
|
$oModuleController->insertTrigger('module.deleteModule', 'document', 'controller', 'triggerDeleteModuleDocuments', 'after'); |
48
|
|
|
|
49
|
|
|
// 2009. 01. 29 Added a trigger for additional setup |
50
|
|
|
$oModuleController->insertTrigger('module.dispAdditionSetup', 'document', 'view', 'triggerDispDocumentAdditionSetup', 'before'); |
51
|
|
|
|
52
|
|
|
if(!is_dir('./files/cache/tmp')) |
53
|
|
|
{ |
54
|
|
|
FileHandler::makeDir('./files/cache/tmp'); |
55
|
|
|
} |
56
|
|
|
|
57
|
|
|
return new Object(); |
58
|
|
|
} |
59
|
|
|
|
60
|
|
|
/** |
61
|
|
|
* A method to check if successfully installed |
62
|
|
|
* @return bool |
63
|
|
|
*/ |
64
|
|
|
function checkUpdate() { |
65
|
|
|
$oDB = &DB::getInstance(); |
66
|
|
|
$oModuleModel = getModel('module'); |
67
|
|
|
|
68
|
|
|
// 2007. 7. 25: Add a column(notify_message) for notification |
69
|
|
|
if(!$oDB->isColumnExists("documents","notify_message")) return true; |
70
|
|
|
|
71
|
|
|
// 2007. 8. 23: create a clustered index in the document table |
72
|
|
|
if(!$oDB->isIndexExists("documents","idx_module_list_order")) return true; |
73
|
|
|
if(!$oDB->isIndexExists("documents","idx_module_update_order")) return true; |
74
|
|
|
if(!$oDB->isIndexExists("documents","idx_module_readed_count")) return true; |
75
|
|
|
if(!$oDB->isIndexExists("documents","idx_module_voted_count")) return true; |
76
|
|
|
// 2007. 10. 17 Add a trigger to delete all posts together when the module is deleted |
77
|
|
|
if(!$oModuleModel->getTrigger('module.deleteModule', 'document', 'controller', 'triggerDeleteModuleDocuments', 'after')) return true; |
78
|
|
|
// 2007. 10. 25 add parent_srl, expand to the document category |
79
|
|
|
if(!$oDB->isColumnExists("document_categories","parent_srl")) return true; |
80
|
|
|
if(!$oDB->isColumnExists("document_categories","expand")) return true; |
81
|
|
|
if(!$oDB->isColumnExists("document_categories","group_srls")) return true; |
82
|
|
|
// 2007. 11. 20 create a composite index on the columns(module_srl + is_notice) |
83
|
|
|
if(!$oDB->isIndexExists("documents","idx_module_notice")) return true; |
84
|
|
|
// 2008. 02. 18 create a composite index on the columns(module_srl + document_srl) (checked by Manian)) |
85
|
|
|
if(!$oDB->isIndexExists("documents","idx_module_document_srl")) return true; |
86
|
|
|
|
87
|
|
|
// 2007. 12. 03: Add if the colume(extra_vars) doesn't exist |
88
|
|
|
if(!$oDB->isColumnExists("documents","extra_vars")) return true; |
89
|
|
|
// 2008. 04. 23 Add a column(blamed_count) |
90
|
|
|
if(!$oDB->isColumnExists("documents", "blamed_count")) return true; |
91
|
|
|
if(!$oDB->isIndexExists("documents","idx_module_blamed_count")) return true; |
92
|
|
|
if(!$oDB->isColumnExists("document_voted_log", "point")) return true; |
93
|
|
|
// 2008-12-15 Add a column(color) |
94
|
|
|
if(!$oDB->isColumnExists("document_categories", "color")) return true; |
95
|
|
|
|
96
|
|
|
/** |
97
|
|
|
* 2009. 01. 29: Add a column(lang_code) if not exist in the document_extra_vars table |
98
|
|
|
*/ |
99
|
|
|
if(!$oDB->isColumnExists("document_extra_vars","lang_code")) return true; |
100
|
|
|
|
101
|
|
|
if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'document', 'view', 'triggerDispDocumentAdditionSetup', 'before')) return true; |
102
|
|
|
// 2009. 03. 09 Add a column(lang_code) to the documnets table |
103
|
|
|
if(!$oDB->isColumnExists("documents","lang_code")) return true; |
104
|
|
|
// 2009. 03. 11 check the index in the document_extra_vars table |
105
|
|
|
if(!$oDB->isIndexExists("document_extra_vars", "unique_extra_vars")) return true; |
106
|
|
|
|
107
|
|
|
// 2009. 03. 19: Add a column(eid) if not exist in the table |
108
|
|
|
if(!$oDB->isColumnExists("document_extra_keys","eid")) return true; |
109
|
|
|
if(!$oDB->isColumnExists("document_extra_vars","eid")) return true; |
110
|
|
|
|
111
|
|
|
// 2011. 03. 30 Cubrid index Check the index in the document_extra_vars table |
112
|
|
|
if(!$oDB->isIndexExists("document_extra_vars", "idx_document_list_order")) return true; |
113
|
|
|
|
114
|
|
|
//2011. 04. 07 adding description column to document categories |
115
|
|
|
if(!$oDB->isColumnExists("document_categories","description")) return true; |
116
|
|
|
|
117
|
|
|
//2011. 05. 23 adding status column to document |
118
|
|
|
if(!$oDB->isColumnExists('documents', 'status')) return true; |
119
|
|
|
|
120
|
|
|
//2011. 06. 07 check comment status update |
121
|
|
|
if($oDB->isColumnExists('documents', 'allow_comment') || $oDB->isColumnExists('documents', 'lock_comment')) return true; |
122
|
|
|
|
123
|
|
|
// 2011. 10. 25 status index check |
124
|
|
|
if(!$oDB->isIndexExists("documents", "idx_module_status")) return true; |
125
|
|
|
|
126
|
|
|
// 2012. 02. 27 Add a trigger to copy extra keys when the module is copied |
127
|
|
|
if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'document', 'controller', 'triggerCopyModuleExtraKeys', 'after')) return true; |
128
|
|
|
|
129
|
|
|
// 2012. 08. 29 Add a trigger to copy additional setting when the module is copied |
130
|
|
|
if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'document', 'controller', 'triggerCopyModule', 'after')) return true; |
131
|
|
|
|
132
|
|
|
return false; |
133
|
|
|
} |
134
|
|
|
|
135
|
|
|
/** |
136
|
|
|
* Execute update |
137
|
|
|
* @return Object |
138
|
|
|
*/ |
139
|
|
|
function moduleUpdate() |
140
|
|
|
{ |
141
|
|
|
$oDB = &DB::getInstance(); |
142
|
|
|
$oModuleModel = getModel('module'); |
143
|
|
|
$oModuleController = getController('module'); |
144
|
|
|
|
145
|
|
|
// 2007. 7. 25: Add a column(notify_message) for notification |
146
|
|
|
if(!$oDB->isColumnExists("documents","notify_message")) |
147
|
|
|
{ |
148
|
|
|
$oDB->addColumn('documents',"notify_message","char",1); |
149
|
|
|
} |
150
|
|
|
|
151
|
|
|
// 2007. 8. 23: create a clustered index in the document table |
152
|
|
|
if(!$oDB->isIndexExists("documents","idx_module_list_order")) |
153
|
|
|
{ |
154
|
|
|
$oDB->addIndex("documents","idx_module_list_order", array("module_srl","list_order")); |
155
|
|
|
} |
156
|
|
|
|
157
|
|
|
if(!$oDB->isIndexExists("documents","idx_module_update_order")) |
158
|
|
|
{ |
159
|
|
|
$oDB->addIndex("documents","idx_module_update_order", array("module_srl","update_order")); |
160
|
|
|
} |
161
|
|
|
|
162
|
|
|
if(!$oDB->isIndexExists("documents","idx_module_readed_count")) |
163
|
|
|
{ |
164
|
|
|
$oDB->addIndex("documents","idx_module_readed_count", array("module_srl","readed_count")); |
165
|
|
|
} |
166
|
|
|
|
167
|
|
|
if(!$oDB->isIndexExists("documents","idx_module_voted_count")) |
168
|
|
|
{ |
169
|
|
|
$oDB->addIndex("documents","idx_module_voted_count", array("module_srl","voted_count")); |
170
|
|
|
} |
171
|
|
|
// 2007. 10. 17 Add a trigger to delete all posts together when the module is deleted |
172
|
|
View Code Duplication |
if(!$oModuleModel->getTrigger('module.deleteModule', 'document', 'controller', 'triggerDeleteModuleDocuments', 'after')) |
173
|
|
|
$oModuleController->insertTrigger('module.deleteModule', 'document', 'controller', 'triggerDeleteModuleDocuments', 'after'); |
174
|
|
|
// 2007. 10. 25 add columns(parent_srl, expand) |
175
|
|
|
if(!$oDB->isColumnExists("document_categories","parent_srl")) $oDB->addColumn('document_categories',"parent_srl","number",12,0); |
176
|
|
|
if(!$oDB->isColumnExists("document_categories","expand")) $oDB->addColumn('document_categories',"expand","char",1,"N"); |
177
|
|
|
if(!$oDB->isColumnExists("document_categories","group_srls")) $oDB->addColumn('document_categories',"group_srls","text"); |
178
|
|
|
// 2007. 11. 20 create a composite index on the columns(module_srl + is_notice) |
179
|
|
|
if(!$oDB->isIndexExists("documents","idx_module_notice")) $oDB->addIndex("documents","idx_module_notice", array("module_srl","is_notice")); |
180
|
|
|
|
181
|
|
|
// 2007. 12. 03: Add if the colume(extra_vars) doesn't exist |
182
|
|
|
if(!$oDB->isColumnExists("documents","extra_vars")) $oDB->addColumn('documents','extra_vars','text'); |
183
|
|
|
|
184
|
|
|
// 2008. 02. 18 create a composite index on the columns(module_srl + document_srl) (checked by Manian)) |
185
|
|
|
if(!$oDB->isIndexExists("documents","idx_module_document_srl")) $oDB->addIndex("documents","idx_module_document_srl", array("module_srl","document_srl")); |
186
|
|
|
// 2008. 04. 23 Add a column(blamed count) |
187
|
|
View Code Duplication |
if(!$oDB->isColumnExists("documents", "blamed_count")) |
188
|
|
|
{ |
189
|
|
|
$oDB->addColumn('documents', 'blamed_count', 'number', 11, 0, true); |
190
|
|
|
$oDB->addIndex('documents', 'idx_blamed_count', array('blamed_count')); |
191
|
|
|
} |
192
|
|
|
|
193
|
|
|
if(!$oDB->isIndexExists("documents","idx_module_blamed_count")) |
194
|
|
|
{ |
195
|
|
|
$oDB->addIndex('documents', 'idx_module_blamed_count', array('module_srl', 'blamed_count')); |
196
|
|
|
} |
197
|
|
|
|
198
|
|
|
if(!$oDB->isColumnExists("document_voted_log", "point")) |
199
|
|
|
$oDB->addColumn('document_voted_log', 'point', 'number', 11, 0, true); |
200
|
|
|
|
201
|
|
|
|
202
|
|
|
if(!$oDB->isColumnExists("document_categories","color")) $oDB->addColumn('document_categories',"color","char",7); |
203
|
|
|
|
204
|
|
|
// 2009. 01. 29: Add a column(lang_code) if not exist in the document_extra_vars table |
205
|
|
|
if(!$oDB->isColumnExists("document_extra_vars","lang_code")) $oDB->addColumn('document_extra_vars',"lang_code","varchar",10); |
206
|
|
|
|
207
|
|
|
// 2009. 01. 29 Added a trigger for additional setup |
208
|
|
View Code Duplication |
if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'document', 'view', 'triggerDispDocumentAdditionSetup', 'before')) |
209
|
|
|
$oModuleController->insertTrigger('module.dispAdditionSetup', 'document', 'view', 'triggerDispDocumentAdditionSetup', 'before'); |
210
|
|
|
// 2009. 03. 09 Add a column(lang_code) to the documnets table |
211
|
|
|
if(!$oDB->isColumnExists("documents","lang_code")) |
212
|
|
|
{ |
213
|
|
|
$db_info = Context::getDBInfo(); |
214
|
|
|
$oDB->addColumn('documents',"lang_code","varchar",10, $db_info->lang_code); |
215
|
|
|
$obj->lang_code = $db_info->lang_type; |
|
|
|
|
216
|
|
|
executeQuery('document.updateDocumentsLangCode', $obj); |
217
|
|
|
} |
218
|
|
|
// 2009. 03. 11 Check the index in the document_extra_vars table |
219
|
|
View Code Duplication |
if(!$oDB->isIndexExists("document_extra_vars", "unique_extra_vars")) |
220
|
|
|
{ |
221
|
|
|
$oDB->addIndex("document_extra_vars", "unique_extra_vars", array("module_srl","document_srl","var_idx","lang_code"), true); |
222
|
|
|
} |
223
|
|
|
|
224
|
|
|
if($oDB->isIndexExists("document_extra_vars", "unique_module_vars")) |
225
|
|
|
{ |
226
|
|
|
$oDB->dropIndex("document_extra_vars", "unique_module_vars", true); |
227
|
|
|
} |
228
|
|
|
|
229
|
|
|
// 2009. 03. 19: Add a column(eid) |
230
|
|
|
// 2009. 04. 12: Fixed the issue(#17922959) that changes another column values when adding eid column |
231
|
|
View Code Duplication |
if(!$oDB->isColumnExists("document_extra_keys","eid")) |
232
|
|
|
{ |
233
|
|
|
$oDB->addColumn("document_extra_keys","eid","varchar",40); |
234
|
|
|
|
235
|
|
|
$output = executeQuery('document.getGroupsExtraKeys', $obj); |
236
|
|
|
if($output->toBool() && $output->data && count($output->data)) { |
237
|
|
|
foreach($output->data as $extra_keys) { |
238
|
|
|
$args->module_srl = $extra_keys->module_srl; |
|
|
|
|
239
|
|
|
$args->var_idx = $extra_keys->idx; |
240
|
|
|
$args->new_eid = "extra_vars".$extra_keys->idx; |
241
|
|
|
$output = executeQuery('document.updateDocumentExtraKeyEid', $args); |
242
|
|
|
} |
243
|
|
|
} |
244
|
|
|
} |
245
|
|
|
|
246
|
|
View Code Duplication |
if(!$oDB->isColumnExists("document_extra_vars","eid")) |
247
|
|
|
{ |
248
|
|
|
$oDB->addColumn("document_extra_vars","eid","varchar",40); |
249
|
|
|
$obj->var_idx = '-1,-2'; |
250
|
|
|
$output = executeQuery('document.getGroupsExtraVars', $obj); |
251
|
|
|
if($output->toBool() && $output->data && count($output->data)) |
252
|
|
|
{ |
253
|
|
|
foreach($output->data as $extra_vars) |
254
|
|
|
{ |
255
|
|
|
$args->module_srl = $extra_vars->module_srl; |
256
|
|
|
$args->var_idx = $extra_vars->idx; |
257
|
|
|
$args->new_eid = "extra_vars".$extra_vars->idx; |
258
|
|
|
$output = executeQuery('document.updateDocumentExtraVarEid', $args); |
259
|
|
|
} |
260
|
|
|
} |
261
|
|
|
} |
262
|
|
|
|
263
|
|
|
// 2011. 03. 30 Cubrid index Check the index in the document_extra_vars table |
264
|
|
View Code Duplication |
if(!$oDB->isIndexExists("document_extra_vars", "idx_document_list_order")) |
265
|
|
|
{ |
266
|
|
|
$oDB->addIndex("document_extra_vars", "idx_document_list_order", array("document_srl","module_srl","var_idx"), false); |
267
|
|
|
} |
268
|
|
|
|
269
|
|
|
//2011. 04. 07 adding description column to document categories |
270
|
|
|
if(!$oDB->isColumnExists("document_categories","description")) $oDB->addColumn('document_categories',"description","varchar",200,0); |
271
|
|
|
|
272
|
|
|
//2011. 05. 23 adding status column to document |
273
|
|
|
if(!$oDB->isColumnExists('documents', 'status')) |
274
|
|
|
{ |
275
|
|
|
$oDB->addColumn('documents', 'status', 'varchar', 20, 'PUBLIC'); |
276
|
|
|
$args->is_secret = 'Y'; |
277
|
|
|
$output = executeQuery('document.updateDocumentStatus', $args); |
|
|
|
|
278
|
|
|
} |
279
|
|
|
|
280
|
|
|
// 2011. 09. 08 drop column document is_secret |
281
|
|
|
if($oDB->isColumnExists('documents', 'status') && $oDB->isColumnExists('documents', 'is_secret')) |
282
|
|
|
$oDB->dropColumn('documents', 'is_secret'); |
283
|
|
|
|
284
|
|
|
//2011. 06. 07 merge column, allow_comment and lock_comment |
285
|
|
|
if($oDB->isColumnExists('documents', 'allow_comment') || $oDB->isColumnExists('documents', 'lock_comment')) |
286
|
|
|
{ |
287
|
|
|
$oDB->addColumn('documents', 'comment_status', 'varchar', 20, 'ALLOW'); |
288
|
|
|
|
289
|
|
|
$args->commentStatus = 'DENY'; |
290
|
|
|
|
291
|
|
|
// allow_comment='Y', lock_comment='Y' |
292
|
|
|
$args->allowComment = 'Y'; |
293
|
|
|
$args->lockComment = 'Y'; |
294
|
|
|
$output = executeQuery('document.updateDocumentCommentStatus', $args); |
|
|
|
|
295
|
|
|
|
296
|
|
|
// allow_comment='N', lock_comment='Y' |
297
|
|
|
$args->allowComment = 'N'; |
298
|
|
|
$args->lockComment = 'Y'; |
299
|
|
|
$output = executeQuery('document.updateDocumentCommentStatus', $args); |
|
|
|
|
300
|
|
|
|
301
|
|
|
// allow_comment='N', lock_comment='N' |
302
|
|
|
$args->allowComment = 'N'; |
303
|
|
|
$args->lockComment = 'N'; |
304
|
|
|
$output = executeQuery('document.updateDocumentCommentStatus', $args); |
|
|
|
|
305
|
|
|
} |
306
|
|
|
|
307
|
|
|
if($oDB->isColumnExists('documents', 'allow_comment') && $oDB->isColumnExists('documents', 'comment_status')) |
308
|
|
|
$oDB->dropColumn('documents', 'allow_comment'); |
309
|
|
|
|
310
|
|
|
if($oDB->isColumnExists('documents', 'lock_comment') && $oDB->isColumnExists('documents', 'comment_status')) |
311
|
|
|
$oDB->dropColumn('documents', 'lock_comment'); |
312
|
|
|
|
313
|
|
|
if(!$oDB->isIndexExists("documents", "idx_module_status")) |
314
|
|
|
$oDB->addIndex("documents", "idx_module_status", array("module_srl","status")); |
315
|
|
|
|
316
|
|
|
// 2012. 02. 27 Add a trigger to copy extra keys when the module is copied |
317
|
|
View Code Duplication |
if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'document', 'controller', 'triggerCopyModuleExtraKeys', 'after')) |
318
|
|
|
{ |
319
|
|
|
$oModuleController->insertTrigger('module.procModuleAdminCopyModule', 'document', 'controller', 'triggerCopyModuleExtraKeys', 'after'); |
320
|
|
|
} |
321
|
|
|
|
322
|
|
|
// 2012. 08. 29 Add a trigger to copy additional setting when the module is copied |
323
|
|
View Code Duplication |
if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'document', 'controller', 'triggerCopyModule', 'after')) |
324
|
|
|
{ |
325
|
|
|
$oModuleController->insertTrigger('module.procModuleAdminCopyModule', 'document', 'controller', 'triggerCopyModule', 'after'); |
326
|
|
|
} |
327
|
|
|
|
328
|
|
|
return new Object(0,'success_updated'); |
329
|
|
|
} |
330
|
|
|
|
331
|
|
|
/** |
332
|
|
|
* Re-generate the cache file |
333
|
|
|
* @return void |
334
|
|
|
*/ |
335
|
|
|
function recompileCache() |
336
|
|
|
{ |
337
|
|
|
if(!is_dir('./files/cache/tmp')) |
338
|
|
|
{ |
339
|
|
|
FileHandler::makeDir('./files/cache/tmp'); |
340
|
|
|
} |
341
|
|
|
} |
342
|
|
|
|
343
|
|
|
/** |
344
|
|
|
* Document Status List |
345
|
|
|
* @return array |
346
|
|
|
*/ |
347
|
|
|
function getStatusList() |
348
|
|
|
{ |
349
|
|
|
return $this->statusList; |
350
|
|
|
} |
351
|
|
|
|
352
|
|
|
/** |
353
|
|
|
* Return default status |
354
|
|
|
* @return string |
355
|
|
|
*/ |
356
|
|
|
function getDefaultStatus() |
357
|
|
|
{ |
358
|
|
|
return $this->statusList['public']; |
359
|
|
|
} |
360
|
|
|
|
361
|
|
|
/** |
362
|
|
|
* Return status by key |
363
|
|
|
* @return string |
364
|
|
|
*/ |
365
|
|
|
function getConfigStatus($key) |
366
|
|
|
{ |
367
|
|
|
if(array_key_exists(strtolower($key), $this->statusList)) return $this->statusList[$key]; |
368
|
|
|
else $this->getDefaultStatus(); |
|
|
|
|
369
|
|
|
} |
370
|
|
|
} |
371
|
|
|
/* End of file document.class.php */ |
372
|
|
|
/* Location: ./modules/document/document.class.php */ |
373
|
|
|
|
This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.