В php пишу уже довольно давно, но так получилось, что ООП пользоваться не доводилось, в основном, потому что плохо понимал принцип работы, а изучить времени не хватало. Но вот выдалась свободная неделька и я решил сесть за ООП. После первых попыток мне очень понравилась гибкость такого подхода, откуда и возникло желание переписать движки.
И вот я столкнулся с такой интересной особенностью, в разборе которой и прошу помощи.
Итак, приступим. Есть абстрактный класс в котором описаны методы которые должны иметь все остальные классы:
Код: Выделить всё
class base{ //базовый класс в котором описаны методы используемые всеми классами
function base(){
die('Невозможно создать объект абстрактного класса!');
}
function attr($name){ //возвращает значение атрибута по его имени
return $this->$name;
}
function setattr($name,$value){ //устанавливает атрибут по паре имя - значение. Допускается использование массивов.
if(gettype($name)=='array' and gettype($value)=='array' and sizeof($name)==sizeof($value)){
$i=0;
foreach($name as $val){
$this->$val = $value[$i];
$i++;
}
return true;
}
elseif(gettype($name)=='array' and gettype($value)!='array'){
echo 'Несоответствие заданных типов переменных или размеров массивов при определении аттрибутов!';
return false;
}
else{
$this->$name = $value;
return true;
}
}
}
А еще есть несколько подобных классов:
Код: Выделить всё
class content extends base{//класс, отвечающий за работу с материалами, чтение, добавление, удаление, редактирование.
var $id;
var $img;
var $translit;
var $name;
var $section_id;
var $description;
var $dates;
var $url;
function initiate($tra){
$res = mysql_query("SELECT `id`,`name`,`section_id`,`img`,`description` FROM `content` WHERE `translit`='$tra'");
if(mysql_num_rows($res)>0){
$res=mysql_fetch_array($res);
$s=new section($res['section_id']);
$this->setattr(array('id','translit','name','section_id','description','img','url'),array($res['id'],$tra,$res['name'],$res['section_id'],$res['description'],$res['img'],$s->attr('url').$tra.'/'));
}else{
unset($this);
return false;
}
}
function init_id($i){
$res = mysql_query("SELECT `translit` FROM `content` WHERE `id`='$i'");
$this->initiate(mysql_result($res, 0));
}
}
Так вот, при попытке создать объект класса content
Код: Выделить всё
$s=new content;
скрипт почему-то пытается создать объект абстрактного класса base, что естественно приводит к ошибке и остановки работы:
Невозможно создать объект абстрактного класса!
Так-же заметил, что если сделать конструктор внутри класса, т.е. привести к такому виду:
Код: Выделить всё
class content extends base{//класс, отвечающий за работу с материалами, чтение, добавление, удаление, редактирование.
var $id;
var $img;
var $translit;
var $name;
var $section_id;
var $description;
var $dates;
var $url;
function content(){} // !!!--Если добавляю эту строку - работает--!!!
function initiate($tra){
$res = mysql_query("SELECT `id`,`name`,`section_id`,`img`,`description` FROM `content` WHERE `translit`='$tra'");
if(mysql_num_rows($res)>0){
$res=mysql_fetch_array($res);
$s=new section($res['section_id']);
$this->setattr(array('id','translit','name','section_id','description','img','url'),array($res['id'],$tra,$res['name'],$res['section_id'],$res['description'],$res['img'],$s->attr('url').$tra.'/'));
}else{
unset($this);
return false;
}
}
function init_id($i){
$res = mysql_query("SELECT `translit` FROM `content` WHERE `id`='$i'");
$this->initiate(mysql_result($res, 0));
}
}
Я в недоумении почему так. Может кто-то объяснить?