PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (2): [1] 2 »

> Найдено сообщений: 17
pome Отправлено: 27 Января, 2012 - 18:22:27 • Тема: помогите с наследованием • Форум: Объектно-ориентированное программирование

Ответов: 11
Просмотров: 2257
Bio man
Цитата:
PS. Представленные коды прошу не рассматривать как рабочий код без ошибок, а лишь как пример для того чтобы показать чего я хочу добиться
pome Отправлено: 27 Января, 2012 - 12:59:30 • Тема: помогите с наследованием • Форум: Объектно-ориентированное программирование

Ответов: 11
Просмотров: 2257
Самогонщик
Цитата:
global $ship; $ship[$targetID] - вот это тут нафиг не нужно
полностью согласен, но не мог понять как Радость но вот это
PHP:
скопировать код в буфер обмена
  1. function Weapon->shoot (Ship $target) {
  2.        $this->$ship->Energy->get_energy ($this->required_energy);
  3.         target->set_shoot ($this->power);
  4.  
  5. }
все объясняет Радость Спасибо большое Закатив глазки
pome Отправлено: 27 Января, 2012 - 12:06:25 • Тема: помогите с наследованием • Форум: Объектно-ориентированное программирование

Ответов: 11
Просмотров: 2257
Цитата:
Наследование используется, когда у вас главное орудие какое-нибудь и пулемёт. Между ними много общего, это общее объединяют в базовый класс "оружие" и расширяют и конкретизируют в дочерних. Базовый класс зачастую вообще не используется в явном виде нигде.
Да, видимо не догнал маленько... Хорошо

теперь получается каждый предмет оборудования должен хранить в явном виде ID корабля на котором он установлен для того чтобы обращаться к другим предметам этого корабля и делать это через
PHP:
скопировать код в буфер обмена
  1. function Weapon->shoot () {
  2.         global $ship;
  3.         $ship[$this->ownerID]->Energy->get_energy ($this->required_energy)
  4. }


или так:
PHP:
скопировать код в буфер обмена
  1. class Ship {
  2.         function Ship ($ID) {
  3.                 $this->ID = $ID;
  4.                 $this->Weapon = new Weapon ($this->ID);
  5.                 $this->Energy = new Energy ($this->ID);
  6.         }
  7.         function shoot ($targetID) {
  8.                 list($hit, $energy) = $this->Weapon->shoot ();
  9.                 $this->Energy->get_energy ($enrgy);//вот это, по идее, можно было сделать в Weapon->shoot, но тогда нужно иметь ссылку на объект Energy...
  10.                 $ship[$targetID]->set_shoot ($hit);
  11.         }
  12.         function set_shoot ($hit) {
  13.                 $this->hit += $hit;
  14.         }
  15. }
  16.  


Но в этом случае класс Ship будет перегружен кодом, так как частично функционал оборудования нужно будет описывать в самом классе Ship
(Добавление)
Самогонщик То есть вот так будет правильно:?
PHP:
скопировать код в буфер обмена
  1. class Ship {
  2.         function Ship ($ID) {
  3.                 $this->ID = $ID;
  4.                 $this->Weapon = new Weapon ($this);
  5.                 $this->Energy = new Energy ($this);
  6.         }
  7.         function set_shoot ($hit) {
  8.                 $this->hit += $hit;
  9.         }
  10. }
  11. class Weapon {
  12.         function Weapon ($owner) {
  13.                 $this->owner = $owner;
  14.         }
  15.         function shoot ($targetID) {
  16.                 $this->owner->Energy->get_energy ($this->energy);
  17.                 global $ship;
  18.                 $ship[$targetID]->set_shoot ($this->power);
  19.         }
  20. }
  21. $ship[7]->Weapon->shoot (5);
  22.  
pome Отправлено: 27 Января, 2012 - 11:46:58 • Тема: помогите с наследованием • Форум: Объектно-ориентированное программирование

Ответов: 11
Просмотров: 2257
Цитата:
а зачем пользоваться именно родительским ID?
пользуйтесь тем что было наседовано
через $this->ID


Вся идея в том, что объект Ship должен быть единым объектом и иметь в себе много разных методов, которые подключаются "навешиванием" всякого оборудования, и, например, выстрелив, оружие должно отнять у Ship, например, энергию, а у другому экземпляру Ship нанести повреждение. При этом хочется добиться двусторонней связью между наследниками Ship

PHP:
скопировать код в буфер обмена
  1. class Weapons {
  2.         function __construct () {
  3.                 //загружаем параметры оружия пользователя parent::$ID
  4.                 $this->power = -25;
  5.                 $this->energy = -10;
  6.         }
  7.         function shoot ($targetID) {
  8.                 parent::Energy->get_energy ($this->energy);
  9.                 $ship[$targetID]->set_shoot ($this->power);
  10.         }
  11. }
  12.  
  13. $ship[5]->Weapons->shoot (7);   //корабль 5 стреляет в корабль 7
  14.  


PS. Представленные коды прошу не рассматривать как рабочий код без ошибок, а лишь как пример для того чтобы показать чего я хочу добиться
pome Отправлено: 27 Января, 2012 - 10:31:54 • Тема: помогите с наследованием • Форум: Объектно-ориентированное программирование

Ответов: 11
Просмотров: 2257
Здравствуйте! Начинаю разбираться с ООП, и вот бьюсь уже не первый день:

задача: создать такой экземпляр класa Ship, чтобы он имел методы fly() и Shoot(), определенные в классах Weapons и Engines, свойство mass, определенное в классах Weapons и Engines, а Weapons и Engines могли пользоваться свойством ID (типа parent::$ID)
объекта Ship, определенное в его конструкторе.

По-моему должно получиться что-то вроде:

PHP:
скопировать код в буфер обмена
  1.  
  2. class Ship {
  3.         public $ID, $mass = 0;
  4.         function Ship ($ID) {
  5.                 $this->ID = $ID;
  6.         }
  7. }
  8. class Engines extends Ship {
  9.         function Engines () {
  10.                 parent::$mass += 10;
  11.         }
  12.         function fly () {
  13.                 echo "ship ".parent::$ID." flying\n";
  14.         }
  15. }
  16. class Weapons extends Ship {
  17.         function Weapons () {
  18.                 parent::$mass += 20;
  19.         }
  20.         function shoot () {
  21.                 echo "ship ".parent::$ID." shooting\n";
  22.         }
  23. }
  24.  
  25. $ship1 = new Ship (1);
  26. $ship2 = new Ship (2);
  27. $ship1->shoot();        //нужный результат:             ship 1 shooting
  28. $ship2->fly();          //нужный результат:             ship 2 flying
  29. echo $ship1->mass;      //нужный результат:             30
  30.  


Но как я не бьюсь-ничего не выходит, то дочерний класс не знает ID экземпляра родительского класса, то родительский класс не знает методов дочерних классов, в общем я окончательно запутался и зашел в тупик Не понял Помогите пожалуйста разобраться и изящным способом решить задачу Меланхолия
pome Отправлено: 30 Мая, 2011 - 07:38:26 • Тема: Cессии. Несколько значений • Форум: HTTP и PHP

Ответов: 34
Просмотров: 19780
Dezmonds пишет:
svbPavel! Спасибо вам огромное! работает! иду изучать что и как тут устроено!! Вообще спасибо огромное!


вопрос еще актуален?
pome Отправлено: 27 Мая, 2011 - 14:34:50 • Тема: Cессии. Несколько значений • Форум: HTTP и PHP

Ответов: 34
Просмотров: 19780
Dezmonds пишет:
Все я в конец запутался...

Почему сессия перезаписывается ?!


на это я тебе уже ответил. Ты не можешь использовать никакое другое число для индекса $_SESSION кроме ид товара, иначе у тебя каша получится.

Тот код что я тебе написал работает при последовательном добавлении товаров по одному

если хочешь по несколько сразу добавлять - сначала дай листинг массива print_r($_POST) с несколькими товарами, попробую тебе объяснить что да как.
pome Отправлено: 27 Мая, 2011 - 14:27:28 • Тема: Cессии. Несколько значений • Форум: HTTP и PHP

Ответов: 34
Просмотров: 19780
Dezmonds пишет:
Это бред какой то ей богу... ничего не могу сообразить..


все верноУлыбка Ты еще больше переменных отправь в $_POST у тебя еще больше повторений будетУлыбка Я же тебе давно написал - убери foreach ($_POST as $key => $value), не надо там цикл.

Да там ваще все не так!

CODE (htmlphp):
скопировать код в буфер обмена
  1. if(isset($_POST['submit']))
  2. {
  3. if (!$_SESSION['tovar'])
  4. $_SESSION['tovar']=Array();
  5. $_SESSION['tovar'][$_POST['id']]=array('imya'=>$_POST['name'], 'kolichestvo'=>$_POST['count'], 'tcena'=>$_POST['price']);
  6. header ("Location: basket.php");
  7. }


$i убрал потому что у тебя все время в одно значение будут записываться разные товары. Ты мне вот что лучше поясни: когда ты кнопку "в корзину" нажимаешь - у тебя передается в post произвольное количество товаров или 1?
pome Отправлено: 27 Мая, 2011 - 14:03:27 • Тема: Cессии. Несколько значений • Форум: HTTP и PHP

Ответов: 34
Просмотров: 19780
Dezmonds пишет:
Slavenin - T_DOUBLE_ARROW
Где то тут :
PHP:
скопировать код в буфер обмена
  1. $_SESSION['tovar'][$i]=>array('imya'=>$_POST['name'], 'kolichestvo'=>$_POST['count'], 'tcena'=>$_POST['price']);


убери > после [PHP]$_SESSION['tovar'][$i]=
pome Отправлено: 27 Мая, 2011 - 13:47:29 • Тема: помогите с классом • Форум: Объектно-ориентированное программирование

Ответов: 7
Просмотров: 3026
Stierus пишет:
а зачем ты классы Eq и skills наследуешь от bot ?


Я могу и не наследовать, мне даже так больше нравится. Единственное чего я пытаюсь добиться - это того чтобы классы Skills и Eq могли вызывать загрузку друг друга при необходимости и могли взаимодействовать друг с дргом и с ботом и с другими классами как внутри бота так и с аналогичными классами внутри другого бота.
pome Отправлено: 27 Мая, 2011 - 13:20:10 • Тема: Cессии. Несколько значений • Форум: HTTP и PHP

Ответов: 34
Просмотров: 19780
Dezmonds пишет:
А как добавить еще одно значение а массив?

Сделал так:

PHP:
скопировать код в буфер обмена
  1.  
  2. $_SESSION['tovar'][$_POST['name']]=$_POST['count']=$_POST['price'];
  3.  


Вроде ошибок не выдает



И не будет выдавать. Эта строка сначала присваивает значение $_POST['price'] элементу $_POST['count'] а потом это значение присваевает элементу $_SESSION['tovar'][$_POST['name']], в итоге ты имеешь $_SESSION['tovar'][$_POST['name']]=$_POST['price'];

У тебя есть два вида решения проблеммы:
1) Хранить значение price в $_SESSION, но тебе нужно изменить структуру массива типа так
CODE (htmlphp):
скопировать код в буфер обмена
  1. $_SESSION['id']=Array {
  2.        [tovar_id]=Array {
  3.               ['name']=Конопля
  4.               ['col']=3
  5.               ['price']=20
  6.               ['еще одна ненужная переменная']=х.з.
  7.        }
  8. }

но тогда тебе и структуру вывода в корзине нужно поменять.

2) по ИД товара уже на страничке корзины запрашивать из базы данных все нужные данные, типа название, цена за единицу и т.д. и делать вывод.

3) Читай предыдущий постУлыбка
pome Отправлено: 27 Мая, 2011 - 12:44:06 • Тема: Cессии. Несколько значений • Форум: HTTP и PHP

Ответов: 34
Просмотров: 19780
Dezmonds пишет:
pome - так, вроде понятно, а как можно вывести это в нужном мне стиле.
Тоесть не так как выводит:

Array ( [id] => Array ( [Маргарита] => 1 [Гавайская] => 50 ) )
А скажем так:

Id Товар: Колличество: Сумма:
1 Маргарита 1 -
2 Гавайская 50 -



ну это ты спросилУлыбка
PHP:
скопировать код в буфер обмена
  1. foreach ($_SESSION['id'] as $tovar_id => $col) echo "$tovar_id=$col<br>";


Ну а остальное сам думаю осилишьУлыбка

Dezmonds пишет:

И вообще как управлять определенными данными в массиве.. Тоесть допусти по id /
Типа удалить товар где Id = 1


pome пишет:

unset($_SESSION['id'][1]);
pome Отправлено: 27 Мая, 2011 - 12:26:54 • Тема: помогите с классом • Форум: Объектно-ориентированное программирование

Ответов: 7
Просмотров: 3026
Stierus пишет:

Если лень в яндексе вбивать "lazy load" - то я это уе сделал


Еще бы с самого начала знать как называется то что я пишуУлыбка За пример спасибо, сейчас попробуюУлыбка

Выводит:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Bot Object
  3. (
  4.     [data:private] => Array
  5.         (
  6.             [Skills] => Skills Object
  7.                 (
  8.                     [data:private] => Array
  9.                         (
  10.                         )
  11.  
  12.                     [skill] => 100
  13.                 )
  14.          )
  15. )
  16.  


только я не пойму, откуда брется [data:private] в классе Skills? Наследуется от Bot? И как теперь из Skills создать Eq для Bot если потребуется?
(Добавление)
PHP:
скопировать код в буфер обмена
  1.  
  2. class Bot {
  3.         private $data = array();
  4.        
  5.         public function __get($nm) {
  6.                 echo "get $nm <br>";
  7.                 if(!isset($this->data[$nm])){
  8.                         $this->initialize($nm);
  9.                 }
  10.                 return $this->data[$nm];
  11.         }
  12.        
  13.         private function initialize($nm){
  14.         if(!class_exists($nm)){
  15.             throw new Exception('trying to initialize unknown class '.$nm);
  16.         }
  17.         $this->data[$nm] = new $nm;
  18.     }
  19. }
  20.  
  21. class Eq extends Bot {
  22.         function __construct() {
  23.                 $this->A=500;
  24.         }
  25. }
  26.  
  27. class Skills extends Bot {
  28.         function __construct() {
  29.                 $this->skill=100;
  30.                 parent::__get('Eq');
  31.         }
  32. }
  33.  
  34. $bot=new Bot;
  35. $bot->Skills;
  36.  


выводит
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Bot Object
  3. (
  4.     [data:private] => Array
  5.         (
  6.             [Skills] => Skills Object
  7.                 (
  8.                     [data:private] => Array
  9.                         (
  10.                             [Eq] => Eq Object
  11.                                 (
  12.                                     [data:private] => Array
  13.                                         (
  14.                                         )
  15.  
  16.                                     [A] => 500
  17.                                 )
  18.                         )
  19.  
  20.                     [skill] => 100
  21.                 )
  22.         )
  23. )
  24.  


То есть Eq является потомком Skills, теперь я вообще не пойму как это происходит.

Нужен вид:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Bot Object
  3. (
  4.     [data:private] => Array
  5.         (
  6.             [Skills] => Skills Object
  7.                 (
  8.                      [skill] => 100
  9.                 )
  10.             [Eq] => Eq Object
  11.                 (
  12.                       [A] => 500
  13.                 )
  14.         )
  15. )
pome Отправлено: 27 Мая, 2011 - 12:21:50 • Тема: Cессии. Несколько значений • Форум: HTTP и PHP

Ответов: 34
Просмотров: 19780
Dezmonds пишет:
не могли бы вы мне словами разжевать.

PHP:
скопировать код в буфер обмена
  1. foreach ($_POST as $key => $value)
  2. {
  3. if (!$_SESSION['id'])
  4. $_SESSION['id']=Array();
  5. $_SESSION['id'][$_POST['name']]=$_POST['count'];
  6. }
  7.  


Короче суть такова: при каждом нажатии кнопки "добавить" перезагружается страничка и приходит массив $_POST такого вида :
$_POST (Array)
['name']=1;
['col']=3;

кстати, код можно упростить, если передаются данные ОДНОГО товара. А так и есть
PHP:
скопировать код в буфер обмена
  1.  
  2. if (!$_SESSION['id']) $_SESSION['id']=Array();
  3. $_SESSION['id'][$_POST['name']]=$_POST['count'];
  4.  


Ну и соответственно в $_SESSION['id'] под номером товара записывается его заказанное количество. Да и все собственно.

теперь
$_SESSION['id'] (Array)
[1]=3;

при следующем обращении к страничке это значение никуда не девается, можно добавлять новые или удалять старые (unset($_SESSION['id'][1]))

PS: не забудь про спасибоУлыбка
pome Отправлено: 27 Мая, 2011 - 11:17:14 • Тема: Cессии. Несколько значений • Форум: HTTP и PHP

Ответов: 34
Просмотров: 19780
Dezmonds пишет:
pome ни то...

Нужно сделать чтобы товар, на которы я нажал. добавлялся в сессию..
Даже если я на главной нажал заказать для 5 разных товаров, чтобы все эти 5 товаров записались в сессию

А в корзине выводились все товары из сессии (которые пользователь добавил в корзину)


Блин да все то:
index.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. foreach ($_POST as $key => $value) {
  4.         if (!$_SESSION['id']) $_SESSION['id']=Array();
  5.         $_SESSION['id'][$_POST['tovar']]=$_POST['col'];
  6. }
  7. print_r($_SESSION);
  8.  
  9. ?>
  10.  
  11. <table border=1>
  12. <form action='' method='post'>
  13. <tr><td>Товар 1<input type='hidden' value='1' name='tovar'></td>
  14. <td><input type='text' name='col'></td>
  15. <td><input type='submit'></td></tr></form>
  16. <form action='' method='post'>
  17. <tr><td>Товар 36<input type='hidden' value='36' name='tovar'></td>
  18. <td><input type='text' name='col'></td>
  19. <td><input type='submit'></td></tr></form>
  20. <form action='' method='post'>
  21. <tr><td>Товар 28<input type='hidden' value='28' name='tovar'></td>
  22. <td><input type='text' name='col'></td>
  23. <td><input type='submit'></td></tr></form>
  24. </table>
  25.  
  26. <a href='busket.php'>корзина:</a>
  27.  
  28.  


busket.php:

Страниц (2): [1] 2 »
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB