Разделы
Теги | RSS © 2008 – 2017
Контакты
email: igor@veselov.sumy.ua
skype: utz0r2

2. Коротко ООП PHP - Принципы: инкапсуляция, полиморфизм, наследование


Обьект Car в жизни это слишком обобщенно. Поэтому создадим машины унаследовав родитель-класс Car (наследование), имзеним их свойства и методы при необходимости (полиморфизм), и ограничим области видимости свойств и методов с помощью спецификаторов доступа private, protected, public ( инкапсуляция(сокрытие внутренних процессов)).
<?php
class Car {

	const DOORS = 5;
	const TYPE = 'хетчбек';

	// инкапсуляция	(ограничили область видимости свойств odo только классом Car и его наследникми)
	protected $odo;
	
	public $fuel = 100;
	public $speed = 0;

	public function run( $speed = 0, $time = 0 ) {
		$this->speed = $speed;
		$this->odo = $speed*$time;
		return 'Движемся со скоростью: ' . $speed . ' км/ч. В течении '  .$time . ' часов <br/>';
	}

	public function stop() {
		$this->speed = 0;
		return 'Остановились, наша скорость: 0 км/ч <br/>' . $this->getOdo();
	}

	// инкапсуляция (ограничили область видимости метода getOdo только классом Car)
	private function getOdo () {
		return 'Проехали дистанцию: ' . $this->odo . ' км <br/>';
	}
	
}

// наследование (наследуем класс родитель Car)
class Zaz extends Car {
	
	// полиморфизм (переопределили константы DOORS и TYPE для Zaz)
	const DOORS = 4;
	const TYPE = 'седан';
	
	// полиморфизм (переопределили свойство $fuel)
	public $fuel = 40;

	// расширили новым методом zagloh только для класса Zaz 
	public function zagloh () {
		return 'Заглох... <br/>';
	}
	
}

// наследование (наследуем класс родитель Car)
class Amfibia extends Car {

	// полиморфизм (переопределили метод run, все остальное осталось от класса Car)
	public function run ( $speed = 0, $time = 0, $water = 0 ) {
		$this->speed = $water == 1? $speed/3 :	$speed;
		$this->odo = $this->speed*$time;
		return 'Движемся со скоростью: ' . $this->speed . ' км/ч. В течении '  .$time . ' часов <br/>';
	}
	
	// рашсирили родительский метод stop
	public function stop() {
		return 'Пшшшш... ' . parent::stop();
	}
	
}


// Cоздаем экземпляр объекта класса Zaz
$car = new Zaz();
echo 'У машины: ' . $car::DOORS . ' двери<br/>';
echo 'Тип машины: ' . $car::TYPE . '<br/>';
echo 'В баке: ' . $car->fuel . ' л топлива<br/>';
echo 'Текущая скорость машины: ' . $car->speed . ' км/ч<br/>';
echo $car->run();
echo $car->zagloh();
echo $car->run(60, 10);
echo $car->stop();

// Cоздаем экземпляр объекта класса Amfibia
$car2 = new Amfibia();
echo 'По воде: ' . $car2->run(60, 10, 1);
echo $car2->stop();

1. Коротко ООП PHP - Класс (class) и его объект (object)


Класс – это способ описания сущности. И по классу создается объект (экземпляр класса).
Если абстрогироваться еще больше, то класс - это чертеж автомобиля, а обьект - это сам автомобиль собраный по чертежу. Рассмотрим пример.
<?php
class Car {
	
	// константы
	const DOORS = 5;
	const TYPE = 'хетчбек';
	
	// свойства
	public $fuel = 100;
	public $speed = 0;
	public $odo;
	public $status = 'хорошее';
	
	// метод run ( имеет входные параметры скорость и время )
	public function run( $speed = 0, $time = 0 ) {
		// $this это обращение к переменной или методу в контексте класса
		$this->speed = $speed;
		$this->odo = $speed * $time;
		return 'Движемся со скоростью: ' . $speed . ' км/ч. В течении '  .$time . ' часов';
	}
	
	// метод stop
	public function stop() {
		$this->speed = 0;
		return 'Остановились, наша скорость: 0 км/ч';
	}

	// метод getOdo
	public function getOdo () {
		return 'Проехали дистанцию: ' . $this->odo . ' км';
	}
	
}

// Cоздаем экземпляр объекта класса Car
$car = new Car();

// Вызов констант
echo 'У машины: ' . $car::DOORS . ' дверей<br/>';
echo 'Тип машины: ' . $car::TYPE . ' <hr/>';

// Текущие свойства
echo 'В баке: ' . $car->fuel . ' л топлива<br/>';

// Операция над свойством
$car->fuel = $car->fuel/2; // Слили половину =)

echo 'Теперь в баке: ' . $car->fuel . ' л топлива<br/>';
echo 'Текущая скорость машины: ' . $car->speed . ' км/ч<hr/>';

// Выполнение методов
echo $car->run() . '<br/>';
echo $car->run(60,10) . '<br/>';
echo $car->stop() . '<br/>';
echo $car->getOdo();

0. Коротко ООП PHP - Плюсы и минусы


Начинаю серию постов под названием "Коротко ООП PHP". В цикле затрону основные моменты обьектно ориентированного программирования на PHP. А сегодня начнем с плюсов и минусов. Подразумевается, что вы вкурсе что такое PHP на уровне новичка.

Плюсы: помогает создавать более управляемые проекты за счет создания обьектов, сводит дублирование кода к минимуму, код более расширяем и структурирован. Тестируемый. И закрыт от внешнего мира.

Минусы: производительность, она ниже. Необходимо понимать базовые концепции. Проектирование классов не всегда просто, и скорей всего придеться переписывать, пока не научишся на ошибках. Документировать классы сложней, т.к. методы могут переопределяться. Иногда сложно понять какие поля и методы относятся к данному классу из за сложности ирархии классов и приходится просматривать весь код. В библиотечном классе часто содержится больше методов, чем это реально необходимо.

Цитата из книги, которая ставит все на место:
Процедурный код (код, использующий структуры данных) позволяет легко добавлять новые функции без изменения существующих структур данных. Объектно - ориентированный код, напротив, упрощает добавление новых классов без изменения существующих функций.
Обратные утверждения также истинны.
Процедурный код усложняет добавление новых структур данных, потому что оно требует изменения всех функций. Объектно-ориентированный код усложняет добавление новых функций, потому что для этого должны измениться все классы.
Таким образом, то, что сложно в ОО, просто в процедурном программировании, а то, что сложно в процедурном программировании, просто в ОО!

callmecavs/gotem - js скрипт копирования в буфер на современных браузерах


import gotem from 'gotem'

// a trigger and target node are required
const nodes = {
  trigger: document.getElementById('trigger'),
  target: document.getElementById('target')
}

// when the trigger is clicked,
// the text of the target will be copied to the clipboard
gotem(nodes.trigger, nodes.target)

// if an object with callback functions (success, error) is passed,
// the appropriate function, based on the result of executing the copy command, will be fired if it exists
gotem(nodes.trigger, nodes.target, {
  success: () => console.log('Copy command succeeded'),
  error: () => console.log('Copy command failed, BUT the text to copy has still been selected.')
})

https://github.com/callmecavs/gotem

rinvex/country - php библиотека для получения данных о стране


// Get single country
$egypt = country('eg');

// Get country name                                 // Get country native name
echo $egypt->getName();                             echo $egypt->getNativeName();

// Get country official name                        // Get country ISO 3166-1 alpha2 code
echo $egypt->getOfficialName();                     echo $egypt->getIsoAlpha2();

// Get country area                                 // Get country borders
echo $egypt->getArea();                             echo $egypt->getBorders();

// Get country currencies                           // Get country languages
echo $egypt->getCurrencies();                       echo $egypt->getLanguages();

// Get country emoji                                // Get country flag
echo $egypt->getEmoji();                            echo $egypt->getFlag();


// Get all countries                                // Get countries with where condition (continent: Oceania)
$countries = countries();                           $whereCountries = \Rinvex\Country\Loader::where('geo.continent', ['OC' => 'Oceania']);

https://github.com/rinvex/country

Instaphp - php api для работы с инстаграмом


<?php

    $api = new Instaphp\Instaphp([
        'client_id' => 'your client id',
        'client_secret' => 'your client secret',
        'redirect_uri' => 'http://somehost.foo/callback.php',
        'scope' => 'comments+likes'
    ]);

    $popular = $api->Media->Popular(['count' => 10]);

    if (empty($popular->error)) {
        foreach ($popular->data as $item) {
            printf('<img src="%s">', $item['images']['low_resolution']['url']);
        }
    }
?>
https://github.com/sesser/Instaphp
«»
Вверх