Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2016, 10:05   #1
KDVMan
Новичок
Джуниор
 
Регистрация: 08.12.2016
Сообщений: 6
По умолчанию Наследование и передача параметров

Всем привет,
возник вопрос
есть свой движок
вот такая структура входа получается (используется автолоадер классов)

идет запрос страницы,
запускается скрипт index.php где прогружаются все нужные модули и прочее (у админки свой index.php, у самого сайта свой index.php),
далее загружается класс Index (у админки свой Index, у сайта свой Index), который наследуется от класса Base, который в свою очередь наследуется от SuperBase (имена для примера привел)
в классе SuperBase подгружаются нужные классы и переменные, которые используются на всем сайте,
а вот классы Base разные, у админки свой Base, у самого сайта (тот что видят люди) свой Base - соответственно в каждом Base подгружаются свои методы и переменные
в итогде в классе Index содержатся все необходимое для работы админки или сайта (в зависимости, где мы это дело вызываем)

так вот, на данный момент у меня все работает так как написано выше и вот так как напишу далее:
т.е. после того как в Index классе мы подгрузили все что нам надо, он (класс Index) загружает необходимый класс (в зависимости что мы запросили), ну например категории настроек в админке ссылка будет вида: index.php?module=settings&script=ca tegory (просто для примера)

т.е. будет вызван класс Category из пространства имен Settings (ну не суть), в свою очередь этот Category наследуется так же от Base (в данном случае Base относится к админке) и по сути проиходят двойные вызовы всего, что есть в Base и в SuperBase

так вот вопрос, я сейчас хочу переделать все это дело вот в таком варианте:
ссылка все так же ведет на index.php?module=settings&script=ca tegory (просто для примера)
подгружается как я написал выше Index класс, который в свою очередь наследуется и получает все необходимое и он вызывает класс Category из пространства имен Settings и передает в конструктор класса Category $this (пример: $class = new Category($this)) и в классе Category я уже в конструкторе делаю присвоение
function __construct($context)
{
$this->context = $context;
$this->db = $this->context->db;
и т.д
}

но получается тут происходит дублирование переменных
т.е. мне придется делать $this->что-то = $context->что-то для всех переменных, которые есть в Base и в SuperBase классах

как избежать такого дубляжа? может быть вообще эта структура не верна в корне и кто-то сможет посоветовать как лучше сделать структуру?

т.е. задача, что бы все мои классы, которые вызывает Index имели доступ к методам, которые загружаются в Base и SuperBase (там помимо своих методов, в них инициализируются другие классы, например в которых просто полезные функции, так вот к ним так же доступ нужен)

заранее благодарю
если что непонятно написал, задавайте вопросы, постараюсь расписать более подробно
KDVMan вне форума Ответить с цитированием
Старый 08.12.2016, 11:36   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от KDVMan Посмотреть сообщение
т.е. задача, что бы все мои классы, которые вызывает Index имели доступ к методам, которые загружаются в Base и SuperBase (там помимо своих методов, в них инициализируются другие классы, например в которых просто полезные функции, так вот к ним так же доступ нужен)
Вроде ж и без дублирования всё работает:
PHP код:
class SuperBase
{
    public 
$super_base 'SuperBase attribute';
    
    public function 
superBaseMethod($caller '')
    {
        echo 
'I\'m a SuperBase method! Caller: ' $caller'<br/>';
    }
}

class 
Base extends SuperBase
{
    public 
$base 'Base attribute';
    
    public function 
baseMethod($caller '')
    {
        echo 
'I\'m a Base method! Caller: ' $caller'<br/>';
    }
}

class 
Index extends Base
{
    public function 
getCategoryInfo($name '')
    {
        
$category = new Category();
        
$category->displayCategoryName($name);
        
$category->displayBase();
        
$category->displaySuperBase();
        
$category->justCategoryMethod(__CLASS__);
    }

    public function 
displayBase()
    {
        
$this->baseMethod('Index');
    }

    public function 
displaySuperBase()
    {
        
$this->superBaseMethod('Index');
    }
}

class 
Category extends Base
{
    public function 
displayCategoryName($name '')
    {
        echo 
$name '<br/>';
    }

    public function 
displayBase()
    {
        
$this->baseMethod('Category');
    }

    public function 
displaySuperBase()
    {
        
$this->superBaseMethod('Category');
    }

    public function 
justCategoryMethod($caller '')
    {
        
$caller = (!empty($caller)) ? $caller __CLASS__;
        echo 
'I\'m a just Category method! Caller: ' $caller '<br/>';
    }
}

$index = new Index();
$index->getCategoryInfo('Some Category Name');
$index->displayBase();
$index->displaySuperBase();
echo 
'$index->base = ' $index->base'<br/>';
echo 
'$index->super_base = ' $index->super_base'<br/>';
$category = new Category();
echo 
'$category->base = ' $category->base'<br/>';
echo 
'$category->super_base = ' $category->super_base'<br/>'
Результат:
Some Category Name
I'm a Base method! Caller: Category
I'm a SuperBase method! Caller: Category
I'm a just Category method! Caller: Index
I'm a Base method! Caller: Index
I'm a SuperBase method! Caller: Index
$index->base = Base attribute
$index->super_base = SuperBase attribute
$category->base = Base attribute
$category->super_base = SuperBase attribute
Andkorol вне форума Ответить с цитированием
Старый 08.12.2016, 11:40   #3
KDVMan
Новичок
Джуниор
 
Регистрация: 08.12.2016
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Вроде ж и без дублирования всё работает:
PHP код:
class SuperBase
{
    public 
$super_base 'SuperBase attribute';
    
    public function 
superBaseMethod($caller '')
    {
        echo 
'I\'m a SuperBase method! Caller: ' $caller'<br/>';
    }
}

class 
Base extends SuperBase
{
    public 
$base 'Base attribute';
    
    public function 
baseMethod($caller '')
    {
        echo 
'I\'m a Base method! Caller: ' $caller'<br/>';
    }
}

class 
Index extends Base
{
    public function 
getCategoryInfo($name '')
    {
        
$category = new Category();
        
$category->displayCategoryName($name);
        
$category->displayBase();
        
$category->displaySuperBase();
        
$category->justCategoryMethod(__CLASS__);
    }

    public function 
displayBase()
    {
        
$this->baseMethod('Index');
    }

    public function 
displaySuperBase()
    {
        
$this->superBaseMethod('Index');
    }
}

class 
Category extends Base
{
    public function 
displayCategoryName($name '')
    {
        echo 
$name '<br/>';
    }

    public function 
displayBase()
    {
        
$this->baseMethod('Category');
    }

    public function 
displaySuperBase()
    {
        
$this->superBaseMethod('Category');
    }

    public function 
justCategoryMethod($caller '')
    {
        
$caller = (!empty($caller)) ? $caller __CLASS__;
        echo 
'I\'m a just Category method! Caller: ' $caller '<br/>';
    }
}

$index = new Index();
$index->getCategoryInfo('Some Category Name');
$index->displayBase();
$index->displaySuperBase();
echo 
'$index->base = ' $index->base'<br/>';
echo 
'$index->super_base = ' $index->super_base'<br/>';
$category = new Category();
echo 
'$category->base = ' $category->base'<br/>';
echo 
'$category->super_base = ' $category->super_base'<br/>'
Результат:
Some Category Name
I'm a Base method! Caller: Category
I'm a SuperBase method! Caller: Category
I'm a just Category method! Caller: Index
I'm a Base method! Caller: Index
I'm a SuperBase method! Caller: Index
$index->base = Base attribute
$index->super_base = SuperBase attribute
$category->base = Base attribute
$category->super_base = SuperBase attribute
понятно что работает, но если в Base и SuperBase классах будут конструкторы (а они у меня есть, где вызываются другие классы (нужные)), то вызовы будут по два раза, сначала в Index а потом еще и в Category классе

т.е. вот как в реале:
Код:
class SuperBase 
{ 
    public $super_base = 'SuperBase attribute';
    
    function __construct()
    {
        print "I'm construct from SuperBase!<br />";
    } 
     
    public function superBaseMethod($caller = '') 
    { 
        echo 'I\'m a SuperBase method! Caller: ' . $caller. '<br/>'; 
    } 
} 

class Base extends SuperBase 
{ 
    public $base = 'Base attribute';
    
    function __construct()
    {
        parent::__construct();
        print "I'm construct from Base!<br />";
    }  
     
    public function baseMethod($caller = '') 
    { 
        echo 'I\'m a Base method! Caller: ' . $caller. '<br/>'; 
    } 
}
и получаем
I'm construct from SuperBase!
I'm construct from Base!
I'm construct from SuperBase!
I'm construct from Base!
Some Category Name
I'm a Base method! Caller: Category
I'm a SuperBase method! Caller: Category
I'm a just Category method! Caller: Index
I'm a Base method! Caller: Index
I'm a SuperBase method! Caller: Index
$index->base = Base attribute
$index->super_base = SuperBase attribute
I'm construct from SuperBase!
I'm construct from Base!
$category->base = Base attribute
$category->super_base = SuperBase attribute

обрати внимание на два раза вызов SuperBase и два раза вызов Base

Последний раз редактировалось KDVMan; 08.12.2016 в 11:44.
KDVMan вне форума Ответить с цитированием
Старый 08.12.2016, 13:13   #4
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от KDVMan Посмотреть сообщение
понятно что работает, но если в Base и SuperBase классах будут конструкторы (а они у меня есть, где вызываются другие классы (нужные)), то вызовы будут по два раза, сначала в Index а потом еще и в Category классе
Не, ну это понятное дело, что конструкторы будут дёргаться постоянно – это очевидно и неизбежно. И вопорос в первом топике был вообще немного о другом.

Зачем Category наследовать от Base, если использование Category происходит через Index, который уже наследует Base?
Смысл наследования – это получить функционал родителя.
Ок, функционал Base->SuperBase доступен в Index – зачем этот же функционал нужно иметь в Category, если Category работает через Index?
Andkorol вне форума Ответить с цитированием
Старый 08.12.2016, 14:43   #5
KDVMan
Новичок
Джуниор
 
Регистрация: 08.12.2016
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Не, ну это понятное дело, что конструкторы будут дёргаться постоянно – это очевидно и неизбежно. И вопорос в первом топике был вообще немного о другом.

Зачем Category наследовать от Base, если использование Category происходит через Index, который уже наследует Base?
Смысл наследования – это получить функционал родителя.
Ок, функционал Base->SuperBase доступен в Index – зачем этот же функционал нужно иметь в Category, если Category работает через Index?
во отличный вопрос, дело в том что в Category нужно все что есть в Base и SuperBase
а Index это по сути управление какой класс загрузить (в нашем примере это Category) и этот Index загружает Category и должен дать ему ВСЕ что умеет сам (т.е. все наследия от Base и SuperBase)

и при передаче в Category $this из Index ($class = new Caategory($this)) придется в Category делать нечто типа

function __construct($context)
{
$this->super_base = $context->super_base;
$this->base = $context->base;
и т.д.
}

т.е. по сути дубль, если мне придется добавить какую=то переменную в Base или SuperBase, то и в конструкторе Category придется еще добавлять $this->новая_переменная = $context->новая_переменная

как-то так
KDVMan вне форума Ответить с цитированием
Старый 08.12.2016, 15:21   #6
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от KDVMan Посмотреть сообщение
дело в том что в Category нужно все что есть в Base и SuperBase
а Index это по сути управление какой класс загрузить (в нашем примере это Category) и этот Index загружает Category и должен дать ему ВСЕ что умеет сам (т.е. все наследия от Base и SuperBase)
Так пардон, а нафига тогда Category получать от Index «все наследия от Base и SuperBase» – если сам же Category напрямую наследуется от Base и SuperBase?!?
Andkorol вне форума Ответить с цитированием
Старый 08.12.2016, 15:25   #7
KDVMan
Новичок
Джуниор
 
Регистрация: 08.12.2016
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Так пардон, а нафига тогда Category получать от Index «все наследия от Base и SuperBase» – если сам же Category напрямую наследуется от Base и SuperBase?!?
это сейчас он (Category) наследуется от Base и SuperBase поэтому и получаются двойные вызовы конструкторов этих двух классов (Base и SuperBase), проблема в том что у меня в этих конструкторах вызываются классы, которые обращаются к БД и получаются двойные вызовы... вот поэтому я и хочу переделать, что бы класс Category вызывался из Index с передачей параметров, но сам Category уже ни от кого не наследуется...
KDVMan вне форума Ответить с цитированием
Старый 08.12.2016, 15:30   #8
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Так просто наследуй Category от Index – и получишь в Category весь функционал Index + Base + SuperBase.
Для классов работы с БД есть singleton.
Andkorol вне форума Ответить с цитированием
Старый 08.12.2016, 15:35   #9
KDVMan
Новичок
Джуниор
 
Регистрация: 08.12.2016
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Так просто наследуй Category от Index – и получишь в Category весь функционал Index + Base + SuperBase.
от Index наследоваться нет возможности, т.к. он (Index класс) вызывается из index.php
$index = new Index();
$index->init();

и в самом Index классе вот так вызываются классы:
$className = $this->funcs->getClassName();
$obj = new $className();

т.е. вот этот $this->funcs например как раз и подгрузился из Base
а вот этот className это завимит от того как мы зашли
index.php?module=settings&script=bl abla1
будет вызван из Index класса вот этот класс: Blabla1
если зашли index.php?module=settings&script=ga ga2
будет вызван из Index класса вот этот класс: Gaga2
и т.д

т.е. Index это своего рода управленец всеми классами, у него есть весь нужный функционал и он должен раздавать его другим классам
KDVMan вне форума Ответить с цитированием
Старый 08.12.2016, 15:44   #10
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от KDVMan Посмотреть сообщение
т.е. Index это своего рода управленец всеми классами, у него есть весь нужный функционал и он должен раздавать его другим классам
Для того, чтобы Index мог «раздавать» функционал другим классам – они должны от него наследоваться.
Иначе как ты себе представляешь этот самый процесс «раздачи функционала»?
Andkorol вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# Передача параметров Тамерлан Абилов Помощь студентам 6 09.11.2014 23:05
Наследование. Полиморфизм. Передача параметров. C++ Bitter_Schokolade Помощь студентам 3 06.04.2013 23:13
Передача параметров _Mixer_ Общие вопросы по Java, Java SE, Kotlin 0 22.09.2011 20:17
Передача параметров aesoem Общие вопросы Delphi 8 15.07.2008 21:51
Передача параметров Gudzon Общие вопросы Delphi 12 08.02.2007 08:19