ООП на php. Практика

Vano

Новичок
Хочу хорошо выучить ООП на php. В плане того, когда использовать абстрактные классы или интерфейсы, как лучше всего разбить задачу по обьектам.
Кто знает? может есть какой-нибудь задачник по этой проблеме. Так, чтобы практиковатся по нарастающей сложности. И да, без дурацких автомобилей со свойствами и треугольников - а, чтоб по сайтам практика была.
А может, кто подскажет мне задачу, при решении которой, я б с радостью ребенка понял для чего абстрактные классы и интерфейсы?
 

rdbn

Новичок
Качай фреймворк, что то вроде Kohana или еще чего нить, смотри как там используют ооп. Как вариант еще можешь попробовать переписать все свои проекты на ооп, но смысла особого не будет.

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

WMix

герр M:)ller
Партнер клуба
А может, кто подскажет мне задачу, при решении которой, я б с радостью ребенка понял для чего абстрактные классы и интерфейсы?
для начала напиши 2 различных класса (чем более различны тем прикольней) человек и карта к примеру. найди где эти 2 класса выполняют одинаковую задачу. как придумаешь и опишешь, скинь сюда, дам идею интерфейса или абстрактного класса
 

Вурдалак

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

флоппик

promotor fidei
Команда форума
Партнер клуба
если хочется именно теории ООП всякого, нужно смотреть на какой нить Zend Framework.
А когда надоест правильное ООП, брать кохану, что бы писать код быстро.
 

AmdY

Пью пиво
Команда форума
да, лучше начинать с zend framework 1, он более менее правильный, легко воспринимается новичками и хорошо документирован. Затем кохана, как довольно простой и удобный фреймворк, ну и laravel, как наименее противный из мира php
 

Vano

Новичок
для начала напиши 2 различных класса (чем более различны тем прикольней) человек и карта к примеру. найди где эти 2 класса выполняют одинаковую задачу. как придумаешь и опишешь, скинь сюда, дам идею интерфейса или абстрактного класса
спасибо попробую.
А на счет фреймворков, читать ООП я умею, а вот где и как более полезно использовать какие паттерны - нужен опыт написания.
 

DreamAdviser

Новичок
да, лучше начинать с zend framework 1, он более менее правильный, легко воспринимается новичками и хорошо документирован. Затем кохана, как довольно простой и удобный фреймворк, ну и laravel, как наименее противный из мира php
Принципиально именно ZF 1?
 

AmdY

Пью пиво
Команда форума
DreamAdviser, да, первый принциально, но учить не глубоко, попробовать написать какой-нибудь блог с админкой и выбрасить. Во втором уже большой оверхед, который только запутает новичка.
А да, ещё перед ZF я даю юнит тесты, потестировав пару классов и поработав с моками человек понимает зачем всё это ООП и почему нужно писать так, а не иначе.
 

Vano

Новичок
для начала напиши 2 различных класса (чем более различны тем прикольней) человек и карта к примеру. найди где эти 2 класса выполняют одинаковую задачу. как придумаешь и опишешь, скинь сюда, дам идею интерфейса или абстрактного класса
Только не смеятся) Это всё, что в голову пришло. Может если б что-нибудь по сайтам та больше придумаю. А так:
PHP:
class Human
{
   
    public $country = "";   
    public $city = "";
    public $address = "";
    public $firstname = "";
    public $lastname = "";
    public $age = 0;
   
   
   
   
    public function resume()
    {
       
        echo "
        My name is {$this->firstname} {$this->lastname} and I'm an alcoholic. I live in {$this->country} in the city of {$this->city}.
        I am {$this->age} years old.
        ";
       
    }
   
   
   
   
    public function greetings( $name = "all" )
    {
       
        echo "Hello {$name}! How do you do?";
       
    }
   
   
   
   
   
}





class Map
{
   
    public $scale = 0;
    public $country = "";
    public $mapType = "";
   
   
   
   
    public function __get($attribute)
    {
       
        if($attribute == 'mapName')
        {
            return $this->mapName();
        }
       
    }
   
   
   
   
    private function mapName()
    {
       
        if( !$this->scale OR !$this->country OR !$this->mapType )
        {
            return "Map not ready";
        }
       
        return "{$this->mapType} map of {$this->country} with scale - 1:{$this->scale}";
       
    }
   
   
}




$Human = new Human;

$Human->weight = 70;
$Human->age = 18;
$Human->firstname = "Vanya";
$Human->lastname = "Pupkin";
$Human->country = "Ukraine";
$Human->city = "Kyiv";

$Human->resume();
$Human->greetings("Sanya");





$Map = new Map;
$Map->scale = 1000;
$Map->country = "Ukraine";
$Map->mapType = "political";

echo $Map->mapName;
 

WMix

герр M:)ller
Партнер клуба
хочу чтоб все аттрибуты были приватными у обоих классов, а данные будем вводить через метод exchangeArray( array $array );
к примеру так
PHP:
$map = new Map;
$map->exchangeArray( array('scale' => 1000, 'country' => "Ukraine", 'mapType' => "political") )
заодно можно написать interface с этим методом и сказать что твои классы его имплементируют.
 

Vano

Новичок
Интерфейс назвал ДляКлассов, потому что он (по крайней мере сейчас) не конкретно для объектов карты или человека, а для всех обьектов в которых хотели бы видеть этот метод.
Я догадиваюсь что нужен абстрактный класс, в котором будет реализован этот метод, которого будут наследовать Map and Human.(а почему он абстрактный? потому что он не служит как самостоятельный объект, и наверное по этому Абстрактным классам запретили создавать обьекты). Но! Пока выложу так, как вы просили( зная что могу запутать и себя и весь диалог(если я не прав)).
PHP:
/** interface ForClasses **/
interface ForClasses
{
   
    function exchangeArray();
   
}



/** class Human **/
class Human implements ForClasses
{
   
    private $country = "";   
    private $city = "";
    private $address = "";
    private $firstname = "";
    private $lastname = "";
    private $age = 0;
   
   
   
   
    public function resume()
    {
       
        echo "
        My name is {$this->firstname} {$this->lastname} and I'm an alcoholic. I live in {$this->country} in the city of {$this->city}.
        I am {$this->age} years old.
        ";
       
    }
   
   
   
   
    public function greetings( $name = "all" )
    {
       
        echo "Hello {$name}! How do you do?";
       
    }
   
   
   
   
    public function exchangeArray($arr = array())
    {
       
        foreach($arr as $key=>$value)
        {
            $this->$key = $value;
        }
       
    }
   
   
   
   
}




/** class Map **/
class Map implements ForClasses
{
   
    private $scale = 0;
    private $country = "";
    private $mapType = "";
   
   
   
   
    public function __get($attribute)
    {
       
        if($attribute == 'mapName')
        {
            return $this->mapName();
        }
       
    }
   
   
   
   
    private function mapName()
    {
       
        if( !$this->scale OR !$this->country OR !$this->mapType )
        {
            return "Map not ready";
        }
       
        return "{$this->mapType} map of {$this->country} with scale - 1:{$this->scale}";
       
    }
   
   
   
   
    public function exchangeArray($arr = array())
    {
       
        foreach($arr as $key=>$value)
        {
            $this->$key = $value;
        }
       
    }
   
   
}




$Human = new Human;

$Human->exchangeArray( array('age'=>18, 'firstname'=>"Vanya", 'lastname'=>"Pupkin", 'country'=>"Ukraine", 'city'=>"Kyiv" ) );

$Human->resume();
echo '</br>';
$Human->greetings("Sanya");
echo '</br>';




$Map = new Map;


$Map->exchangeArray( array('scale'=>1000, 'country'=>"Ukraine", 'mapType'=>"political" ) );

echo $Map->mapName;
echo '</br>';
 

AmdY

Пью пиво
Команда форума
из всего этого говна ООП у тебя лишь в одном месте просматривается
PHP:
public function resume()
{

echo "
My name is {$this->firstname}{$this->lastname} and I'm an alcoholic. I live in {$this->country} in the city of {$this->city}.
I am {$this->age} years old.
";

}
Здесь ты работаешь с состоянием объекта.
Я ООП обычно свожу к обозначению - это наличие объектов, которые имеют состояние и взаимодействуют между собой согласно этому состоянию.

PHP:
$human = new Human('Foo');
$human->name() ; // Foo
$human->sayName(); // My name is Foo

$human2 = new Human('Bar');

$human->greeting($human2); // Hello. Bar
Напиши тесты и реализацию для этого примера и в ООП будешь разбираться.
 
Сверху