PHP5.1. Передача в __construct() параметров из класса потомка. Как правильно?

alekciy

Новичок
PHP5.1. Передача в __construct() параметров из класса потомка. Как правильно?

Ни как не могу сообразить в чем дело. Дело такое. Имеем класс и от него потомок:

PHP:
class PlayingCards
{
	public $Cards;
	function __construct($type)
    {
        if ($type == '32')
        {
            $this->Cards = Array('S6','S7','S8','S9','S10','SJ','SQ','SK','SA','C6','C7','C8','C9','C10','CJ','CQ','CK','CA','D6','D7','D8','D9','D10','DJ','DQ','DK','DA','H6','H7','H8','H9','H10','HJ','HQ','HK','HA');
		};
	}
	function shuffleCards ()
	{
		shuffle($this->Cards);
	}
};

class GamePreferance extends PlayingCards
{
    function RoundCards()
    {
        parent::__construct("32");
        parent::shuffleCards();
        return $this->Cards;
	}
};
Теперь создаем экземпляр класса:
PHP:
<?php
$cards = new GamePreferance;
 print_r($cards->RoundCards());
?>
И получаем Warning:
Код:
Warning: Missing argument 1 for PlayingCards::__construct(), called in H:\my_web_project\alekciy.ru\projects\preference\class.php on line 2 and defined in H:\my_web_project\alekciy.ru\projects\preference\class.php on line 18
2 это строка: $cards = new GamePreferance;
18 function __construct($type).

В принципе то код работает и я получаю что хочу, но хотел узнать, на сколько верен такой способ передачи?

Кстати переделал под вариант при котором Warning-а я не получаю:
PHP:
class PlayingCards
{
	public $Cards;
	protected $type;
	
	function __construct()
    {
        if ($this->type == '32')
        {
            $this->Cards = Array('S6','S7','S8','S9','S10','SJ','SQ','SK','SA','C6','C7','C8','C9','C10','CJ','CQ','CK','CA','D6','D7','D8','D9','D10','DJ','DQ','DK','DA','H6','H7','H8','H9','H10','HJ','HQ','HK','HA');
		};
	}
	function shuffleCards ()
	{
		shuffle($this->Cards);
	}
};

class GamePreferance extends PlayingCards
{
    function RoundCards()
    {
    	$this->type = "32";
        parent::__construct();
        parent::shuffleCards();
        return $this->Cards;
	}
};
Однако в чем неверность первого метода я не уловил. Почему в Warning-е пишется о том, что аргумент потерян, хотя логика отрабатывается как и было задуманно?
 

tf

крылья рулят
function __construct($type)
$cards = new GamePreferance;
Missing argument 1 for PlayingCards::__construct()
где у нас параметр, который нужен конструктору?
может стоит подумать об использовании другого метода иницилизации данных?
__construct создал как метод вызываемый во время создания данных
а не чего бы еще небыло
 

alekciy

Новичок
Автор оригинала: tf
__construct создал как метод вызываемый во время создания данных
а не чего бы еще небыло
А впервом варианте я так и пытаюсь сделать. Создать данные в зависимости от некое условия.

Спасибо! В вообщем кажется уловил. У меня получается так, что __construct вызывается еще до начала отработки метода RoundCards когда $type еще не определен и выдает Warnin. Потом идет отработка метода RoundCards, parent::__construct('32') определяет $type и логика отрабатывается как нужно. Вроде так выходит.

-~{}~ 16.04.07 04:21:

Автор оригинала: tf
а если подумать и сново поискать в выделенном тесте?
Все, доперло! Должно быть $cards = new GamePreferance('32');

Спасибо! Теперь точно разобрался.
 

tf

крылья рулят
почему простую инициализацию данных не хочеш делать?
PHP:
class PlayingCards 
{ 
    public $Cards; 
    function __construct($type) 
    { 
        $this->initCards($type);          
    }

    function initCards($type) 
    { 
        if ($type == '32') 
        { 
            $this->Cards = Array('S6','S7','S8','S9','S10','SJ','SQ','SK'); 
        }; 
    } 
    function shuffleCards () 
    { 
        shuffle($this->Cards); 
    } 
}; 

class GamePreferance extends PlayingCards 
{ 
    function RoundCards() 
    { 
        $this->initCards("32"); 
        $this->shuffleCards(); 
        return $this->Cards; 
    } 
};
 

Skubent

Новичок
alekciy, если конструктор не определен в классе, он вызывается от класса-родителя. То есть как-то так будет:
Код:
class GamePreferance extends PlayingCards 
{ 
    function __construct()
    {
        $this->type = 32;
        parent::__construct(); 
    }

    function RoundCards() 
    { 
        $this->shuffleCards(); 
        return $this->Cards; 
    } 
};

$cards = new GamePreferance();
print_r($cards->RoundCards());
 

alekciy

Новичок
Да, спасибо. Я разобрался и уже решил, как буду реализовывать. Теперь то все понятно.
 
Сверху