Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
602 / 577 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
1

доступ к обьектам из разных классов

24.10.2012, 19:40. Просмотров 1071. Ответов 16
Метки нет (Все метки)

Вопрос в коде
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
interface I{}
 
abstract class Base
{
    public $a;
    
    function __construct($a)
    {
        $this->a = $a;
    }
}
 
class A extends Base implements I
{
    protected $b;
    
    function __construct($a, $b)
    {
        parent::__construct($a);
        $this->b = $b;
    }
    
    function get_b()
    {
        return $this->b;
    }
}
 
class B extends Base implements I
{
    protected $c;
    protected $d;
    
    function __construct($a, $c)
    {
        parent::__construct($a);
        $this->c = $c;
        /*в свойство $this->d нужно поместить ссылку на обьект класса А если свойства (А->b == B->c)
            или (А->a == B->a) , т.е можно ли как то определить все существующие обьекты класса А
            ну и потом сделать что то типа
            foreach ($all_objects as $obj){
                if ($obj->get_b() == $this->с || $obj->a == $this->a)
                    $this->d = &$obj;
                else 
                    $this->d = null;
            }
        */
    }
}
 
$a1 = new A(1, 1);
$a2 = new A(2, 2);
$a3 = new A(3, 3);
 
$b1 = new B(1, 1);
$b2 = new B(2, 2);
$b3 = new B(3, 3);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2012, 19:40
Ответы с готовыми решениями:

Доступ к константам из разных классов
Есть набор констант, которые используются в различных классах приложения. Хочется все это как то...

Доступ к одному объекту из разных классов
здравствуйте уважаемые! подскажите как реализовать доступ к одному и тому же объекту из разных...

Доступ к обьектам TForm
Задача в следующем: есть TForm и в на нём лежит порядка 100 кнопок. Кнопки имеют определённые...

Сохранение настроек приложения, доступ к ним из разных классов
Hi ALL) Нужно сохранять состояние/значения разных пользовательских элементов что доступны в панели...

16
1177 / 1127 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
24.10.2012, 23:30 2
Мне кажется вы что то перемудрили
Может лучше задачу опишите словами, без ООП?

A - наследник от Base
B - наследник от Base
Вы в b хотите напихать объектов из A.
При чём которые создали вне класса B.
Вы уверенны что вы правильно спроектировали задачу?)

А зачем вообще пустой интерфейс?
Интерфейс обычно для того, что бы гарантировать, что класс имеет какой то метод
0
602 / 577 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
25.10.2012, 00:01  [ТС] 3
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
Мне кажется вы что то перемудрили
Может лучше задачу опишите словами, без ООП?

A - наследник от Base
B - наследник от Base
Вы в b хотите напихать объектов из A.
При чём которые создали вне класса B.
Вы уверенны что вы правильно спроектировали задачу?)

А зачем вообще пустой интерфейс?
Интерфейс обычно для того, что бы гарантировать, что класс имеет какой то метод
Ну возможно и перемудрил))
Ну задача как таковая носит чисто теоретический характер, так сказать придумана с целью обучения))
я тут читал тему и кстати ваш пост про школу ну и набросал класс с учителями учениуами и родителями)
ну и вот есть родители у которых например может быть два ученика, и я хотел типа таким образом засунуть учеников в родителя
ну например родитель же может посмотреть какие оценки стоят в дневнике ученика, но как родитель может определить какой именно из учеников его ребенок, ну и вот я подумал что может есть какой то способ перебрать все обьявленные экземпляры классов в файле и по общим свойствам(фамилиям) определить кто к кому относится.
Ведь есть же итераторы которые перебирают свойства обьектов, так может и есть что то типо этого но только перебирают обьявленные экземпляры классов.
Ну вот как то так
0
1177 / 1127 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
25.10.2012, 00:55 4
Я сомневаюсь что удачная идея вложить учеников в родителей.
Наследование, это
Человек - Родитель
Человек - Учитель
Человек - Ученик
То етсь выделены общие свойтсва в Родительский класс.
Но это не имеет общего с наследством после смерти или кто твой родитель биологический
Вот собственно это и нужно понимать...

Например: родители, ученики, учителя - люди.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Human
{
    private $name; // имя же есть у всех?
    private $age; // можно возраст
    private $address; // да и адрес можно сюда же
    ....
}
 
class Teacher extends Human
{
    private $disciplines = array(); // предметы
    private $hours; // преподаёт часов в неделю
    private $salary; // вот зарплату лучше сюда поместить, так как это описание школы
                          // и тут не должно быть важным зарплата родителей или учеников.
    ...
}
 
class Parrents extends Human
{
    // где работает
    // телефон
}
 
class   Learner extends Human
{
    // класс где учится
    // ссылки на родителей, так как в школе главное ученик, и если он что то натворил, то нужно найти его родителей
    // то есть решение то принимается что то типа
    // Вызвать родителей Пети
    // И не важно что они могут быть ещё чьими то родителями
    // их нужно помещать через специальный метод. либо при создании класса через конструктор
}
Вот как то так наследование проектируется. А не то что вот он папа, значит он должен быть родительским классом

Добавлено через 3 минуты
А... или я не правильно вас понял.
Вы не наследуете учеников от родителей. Вы их наследуете от Base и тех и тех. Ну тогда сори
0
602 / 577 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
25.10.2012, 01:00  [ТС] 5
ну так у меня так и сделано только название класса не Human а People

Добавлено через 3 минуты
ну наверняка есть какая то функция которая выдает информацию о всех обьявленных обьектах,
ведь есть же функция которая возвращает массив со всеми зарегистрированными функциями
0
1177 / 1127 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
25.10.2012, 01:02 6
Ну вообщем смысл в том, что если это грузить из базы, то я бы делал как то так.
Ученики и родители были бы со связью многие ко многим.
Но так как это школа. Я бы грузил учеников, а потом указателей на родителей внедрял бы в учеников.
Но, на самом деле в этот же момент можно легко внедрять в родителей указатели на детей.
Это что то типа актив рекордс получится.
Собственно в AR так и будет.
Если загрузить учеников, и указать как зависимость родителей, то в учеников будут вложены в масив родители.
А если загрузить родителей и указать им в зависимость учеников, то вложены будут ученики в родителей.

Добавлено через 51 секунду
Цитата Сообщение от alpex Посмотреть сообщение
ну наверняка есть какая то функция которая выдает информацию о всех обьявленных обьектах
Да не надо вам это!
В момент создания и добавляйте.
Зачем вначале впустую создавать классы, а потом их искать где то в памяти приложения и перебирать?
0
602 / 577 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
25.10.2012, 01:02  [ТС] 7
ну вот у вас в классе ученика есть ссылка на родителей, как ее делать передавать вручную?
0
1177 / 1127 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
25.10.2012, 01:08 8
У вас же гже то долджен хранится масисв всех учеников.
Например в случае с AR это будет

PHP
1
$users = User::model()->findAll();
А будет он потому, что вы то зачем то их создали, наверное что бы работать с ними, например вывести на экран, а значит вы их с массива выводить то будите.

Добавлено через 3 минуты
Цитата Сообщение от alpex Посмотреть сообщение
передавать вручную?
Что значит вручную?
Зависит от того как вы создаёте объекты.

Если так

PHP
1
$user = new User;
тогда да.
PHP
1
2
$parent = new Parent;
$user->addParent($parent);
А если нет, если грузите из базы, то в цикле.
Формируете два массива, один ученики.
Потом выбираете все ID родителей для учеников, и тащите с базы родителей.
Дальше пихаете их во второй массив, где ключ будет ID родителя.
И пробегая по первому массиву, учеников, берёте с него ID родителя, вытягиваете по ключу из второго массива родителя для ученика, и пихаете в первый массив, в метод addParent()
0
602 / 577 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
25.10.2012, 01:10  [ТС] 9
Цитата Сообщение от alpex Посмотреть сообщение
Добавлено через 3 минуты
ну наверняка есть какая то функция которая выдает информацию о всех обьявленных обьектах,
ведь есть же функция которая возвращает массив со всеми зарегистрированными функциями
Пока писал это сообщение понял где искать то что я хотел
PHP
1
get_defined_vars()
0
1177 / 1127 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
25.10.2012, 01:25 10
Я вам ещё раз говорю, что делать так
PHP
1
2
3
$a = new A;
$b = new A;
...
а потом где то перебирать это всё, бессмысленно.
зачем тогда тут вообще эти переменные $a, $b...

Добавлено через 2 минуты
Обратите внимание.
Сейчас у вас класс назван например Parent.
Потом вы обзавёте его по другому. Чтобы ваш код заработал, вам придётся привить второй класс. У вас прямая зависимость классов будет.
Нужно внедрять чреез методы. Потом можно сделать класс студент, и уже пихать и студентов родителям. Не меняя не одного класса.

Добавлено через 9 минут
Смотри. Вот AR Yii.
Там есть функция addRelatedRecord($name,$record,$index)
А вот класс который вытаскивает записи и распихивает.
PHP
1
2
3
4
5
foreach($this->children as $child)
            {
                if(!empty($child->relation->select))
                    $record->addRelatedRecord($child->relation->name,null,$child->relation instanceof CHasManyRelation);
            }
идёт перебор записей, и вызывается метод для добавления их в другой класс.
Но не как не сам класс ищет где то в глобальной области экземпляры другого класса.
1
602 / 577 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
25.10.2012, 01:29  [ТС] 11
ну у меня нет базы я все пишу в файле и сейчас в принципе у меня устроенно так
есть метод у класса родителей посмотреть дневник в который я передаю как аргумент ссылку на обьект ученика, но ведь если я передам обьект на совсем другого ученика , который не является ребенком этого родителя то метод все равно отработает, а я хотел таким образом определить является ли переданный обьект(ученик) сыном конкретного родителя, одинаковые ли у них фамилии
(т.е сравнить свойство фамилия обьекта класса ученика который передан в метод класса родителя и свойство фамилия обькта который вызывает данный метод)
0
1177 / 1127 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
25.10.2012, 01:41 12
Цитата Сообщение от alpex Посмотреть сообщение
фамилия объекта класса
Ага, фамилию не отпечатки пальцев, они часто совпадают

Ну так база там или нет - не важно
Кто вам мешает сделать так
PHP
1
2
3
4
5
$child = new Child;
$parent = new Parent;
 
$child->addParent($parent);
$parent->addChild($child);
Теперь они точно знают друг о друге.

Другой вариант.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
class Child
{
    function addParent($p)
    {
        $p->addChild($this);
        $this->parrents[] = $p;
    }
}
 
$child = new Child;
$parent = new Parent;
 
$child->addParent($parent);
Но тут желательно объявить интерфейс родителя, что у него есть свойство addChild. И проверять в функции, что бы нельзя было передать класс без данного метода.

По сути в том же активрекордсе от юии, один класс юзает как раз метод добавления другого класса.
1
602 / 577 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
25.10.2012, 01:49  [ТС] 13
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
По сути в том же активрекордсе от юии, один класс юзает как раз метод добавления другого класса.
Тяжеловато мне пока с этим фреймворком, по 1,5к строк в одном файле плюс где еще и ссылки на разные классы, только с debug получается хоть немного понимать что там происходит
0
1177 / 1127 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
25.10.2012, 01:50 14
Цитата Сообщение от alpex Посмотреть сообщение
1,5к строк в одном файле
Там из них 1300+ комментариев
0
602 / 577 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
25.10.2012, 01:54  [ТС] 15
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
Другой вариант.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
class Child
{
    function addParent($p)
    {
        $p->addChild($this);
        $this->parrents[] = $p;
    }
}
 
$child = new Child;
$parent = new Parent;
 
$child->addParent($parent);
ну да с таким вариантом получится взаимосвязь

Добавлено через 2 минуты
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
Там из них 1300+ комментариев
были бы они на русском, а еще с английским так себе.
Это возможно вам легко с ним если вы его знаете и работаете с ним а еще и со своим кодом ладу дать не могу
0
1177 / 1127 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
25.10.2012, 01:58 16
Получится.
А если вы внутри класса будете перебирать все классы и выискивать вам нужные, то не получится ещё большей связи?)

Вы когда внутри класса юзаете метод получения дневника, у вас уже свзяь.

А если вы из класса юзаете метод получения данных из бд, то у вас связь с PDO или с AR Ну или что вы там юзали.

Связь есть практически всегда
Для этого интерфейсыы кстати и придумали. Вы же планируете что это школа.
А значит у ученкиа есть дневник.
А родители могут смотреть его.
Вот эти дествия вам надо реализховать в ООП.

Но, когда вы сдеалете чреез методв, с внедрением зависимостей - это связь не привязывает имя класса к другому имени класса! Она обязует класс внедряемый иметь какой либо интерфейс.

То есть вы легко можете унаследовать от класса child и создать новый, расширеный класс, напрмиер для школы с доп специальностью, где у ребёнка может быть доп методы или свойства. И передать уже его.
Главное что бы общий интерфейс сохранялся.
1
602 / 577 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
25.10.2012, 02:18  [ТС] 17
А вы давно занимаетесь программированием в целом и конкретно php?

Добавлено через 11 минут
Вообщем спасибо вам за дискуссию, убедили вы меня что идея моя утопичная.
Я тут до spl добрался так что школу пока заброшу, здесь недели две с ним разгребаться придется
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2012, 02:18

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Вектор объектов разных классов. Доступ к свойствам элемента вектора
есть базовый класс class A { //... } есть производные классы class A1 : public A { //......

Доступ к обьектам созданых програмно на вкладках PageControl
Здравствуйте. Возник следующий вопрос. У меня на форме есть TPageControl без единой вкладки. После...

Массив разных классов. Как добратся до всех полей этих классов?
Все классы имеют общего предка. Экземпляры этих классов запихнуты в один массив нужно както...

Разработать иерархию классов, демонстрирующее работу с коллекцией объектов разных классов
Задание: Разработать в соответствии с индивидуальным заданием иерархию классов и приложение,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.