PHP5 - ООП - Полиморфизм - Помогите мне переписать этот простой переключатель - PullRequest
3 голосов
/ 17 февраля 2011

Предполагая, что у меня есть этот классический коммутатор , я знаю, что когда мы создаем классы, не рекомендуется использовать метод switch, поэтому, как я могу перестроить его в класс без использования switch но Полиморфизм и я хотел бы понять подход.

/**
 * globals below are holding unique id 
 * $Franklin['Franklin_id'] , 
 * $Granny_Smith['Granny_Smith_id'] , 
 * etc etc...
 */

global $Fuji, $Gala, $Franklin, $Granny_Smith;

switch($Apple) {
  case 'Fuji':
    $Color = 'Yellowish green';
    $Size = 'medium';
    $Origin = 'Japan';
    $Season = 'October - January';
    $AppleId = $Fuji['Fuji_id']; 
  break;
  case 'Gala':
    $Color = 'yellow';
    $Size = 'medium';
    $Origin = 'New Zealand';
    $Season = 'October - January';
    $AppleId = $Gala['Gala_id'];
  break;
  case 'Franklin':
    $Color = 'Well-colored';
    $Size = 'medium';
    $Origin = 'Ohio';
    $Season = 'October';
    $AppleId = $Franklin['Franklin_id'];
  break;
  case 'Granny_Smith':
    $Color = 'Green';
    $Size = 'medium';
    $Origin = 'Australia';
    $Season = 'October - December';
    $AppleId = $Granny_Smith['Granny_Smith_id'];
  break;
}

тогда я хотел бы иметь возможность использовать что-то вроде этого

$AppleProps = new getApple('Granny_Smith'); // $AppleProps->Color, etc etc

Заранее спасибо и надеюсь, что это может помочь кому-то еще.

С уважением

Luca

Ответы [ 3 ]

5 голосов
/ 17 февраля 2011

Если вы действительно хотите использовать ОО для этого, то должен сделать то, что вам нужно, это создать класс appleFactory, а затем иметь отдельные классы для каждого вида яблока ...

class appleFactory
{
    public static function getApple( $name )
    {
        $className = $name.'_apple';

        return new $className( );
    }
}

class fuji_apple
{
    public function __construct( )
    {
        $this->color = 'Yellowish green';
        $this->size = 'medium';
        $this->origin = 'Japan';
        $this->season = 'October - January';
        $this->appleId = $Fuji['Fuji_id']; 
    }
}

class gala_apple
{
    public function __construct( )
    {
        $this->color = 'Yellow';
        $this->size = 'medium';
        $this->origin = 'New Zealand';
        $this->season = 'October - January';
        $this->appleId = $Gala['Gala_id']; 
    }
}

Тогда используйте это так ...

$fuji = appleFactory::get( 'fuji' );
$gala = appleFactory::get( 'gala' );
4 голосов
/ 17 февраля 2011

Я не совсем уверен, что означают ваши идентификаторы, но этот код дает вам AppleFactory, которая будет "штамповать" каждое новое яблоко уникальным идентификатором.

class AppleFactory {

    static $id = 0;

    static public function getApple($className) {
        $apple = new $className();
        $apple->id = self::$id++;
        return $apple;
    }

}

class Apple {

    public $id;
    public $color;
    public $size;
    public $origin;
    public $season;

}

class GrannySmith extends Apple {

    public function __construct() {
        $this->color = 'Green';
        $this->size = 'medium';
        $this->origin = 'Australia';
        $this->season = 'October - Desember';
    }

}

$a = AppleFactory::getApple('GrannySmith');
print_r($a);
3 голосов
/ 17 февраля 2011

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

$apple_data = array(
  'Fuji' => array(
    'Color' => 'Yellowish green';
    'Size' => 'medium';
    'Origin' => 'Japan';
    'Season' => 'October - January';
    'AppleId' = 1234567890,
  ),
  'Gala' => array(
    'Color' => 'yellow';
    'Size' => 'medium';
    'Origin' => 'New Zealand';
    'Season' => 'October - January';
    'AppleId' => 1234598760,
  ),
  ...
);

Для доступа к атрибутам просто используйте:

$id = $apple_data["Granny_Smith"]["AppleId"]

Или, если вы действительно хотите все эти локальные переменные:

extract($apple_data["Granny_Smith"]);
// creates $Color, $Size, $Origin, $Season, $AppleId in local scope

Если вам действительно нужен синтаксис объекта, попробуйте:

$AppleProps = new ArrayObject($apple_data["Fuji"], 2);
print $AppleProps->Color;

Но так как яблоки ничего не делают, вы, вероятно, не хотите создавать класс или реальные объекты для них. (Черт, яблоки. Просто сидеть и ничего не делать.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...