PDA

Просмотр полной версии : USER_INT: статичный вызов и __conctruct


forever
02.05.2008, 22:02
Вызываю метод своего класса через USER_INT:

lib.SearchVacancyForm = USER_INT
lib.SearchVacancyForm {
includeLibs = fileadmin/scripts/TelgazController.class.php
userFunc = user_TelgazController->ShowSearchVacancyForm
}


По идее в этом случае производится статический вызов метода без создания объекта.

class user_TelgazController
{
private $smarty;

function __construct() {
self::$smarty = new Smarty();
self::$smarty->template_dir = SCRIPT_PATH."templates/";
self::$smarty->compile_dir = SCRIPT_PATH."templates_c/";
self::$smarty->config_dir = SCRIPT_PATH."configs/";
self::$smarty->cache_dir = SCRIPT_PATH."cache/";
self::$smarty->caching = false;

}

static public function ShowSearchVacancyForm() {

return self::$smarty->fetch("search_vac.html");

}
}



Но раз объект не создается, почему происходит вызов конструктора??

void
03.05.2008, 00:45
Объект очень даже создаётся:

$parts = explode('->',$funcName);
if (count($parts)==2) { // Class
$cls = t3lib_div::makeInstanceClassName($parts[0]);
if (class_exists ($cls)) {
$classObj = new $cls;
if (method_exists($classObj, $parts[1])) {
$classObj->cObj = &$this;
$content = call_user_func_array(array($classObj, $parts[1]), array($content, $conf));
//[...]

А то, что вы написали self::$smarty, просто приведёт к тому, что в конструкторе будут заданы не поля объекта, а поля класса...

forever
03.05.2008, 13:32
И правда, спасибо.

Так как же все-таки быть тогда, если хочется использовать статичные методы? Не обращать внимания на то, что создается объект, создать вместо конструктора метод инициалиции и вызывать его каждый раз из других методов?