PHPPamokos.lt


10. Pavyzdžiai iš realių frameworkų

Na ką gi, praėjome visą reikalingą medžiagą, kad galėtumėte taikyti objektinį programavimą. Bet visa tai buvo labiau teorija, parodant tik paprastus pavyzdžius, kad būtų lengviau suprasti. Dabar gi pats laikas pažiūrėti, kaip OOP pritaikomas "realiame gyvenime" - pažvelgsime į kelis visiškai realius pavyzdžius.

Laravel

Pradėkime nuo mano mėgstamo Laravel frameworko (kuriam, beje, paskyriau atskirą online-kursą). Jis veikia populiariu MVC principu - tai yra, Model-View-Controller. Paimkime kaip pavyzdį Controllers dalį ir pažiūrėkime, kaip ten veikia OOP.

Pagrindinis frameworko Controlleris yra app/controllers/BaseController.php faile, kur yra jo klasė:

class BaseController extends Controller {

	/**
	 * Setup the layout used by the controller.
	 *
	 * @return void
	 */
	protected function setupLayout()
	{
		if ( ! is_null($this->layout))
		{
			$this->layout = View::make($this->layout);
		}
	}

}

Taigi, pačiame pirmame pavyzdyje matome beveik visus pagrindus, kuriuos praėjome teorinėse pamokose.

BaseController extends Controller - matyt kažkur yra klasė Controller, kuri turi visų kontrollerių savybes, o BaseController paveldi jos savybes/metodus ir prideda šį tą nuo savęs.

protected function setupLayout - "protected" reiškia kad šio metodo negalima kviesti klasės išorėje (su new BaseController), o tik jį perrašyti dukterinėse klasėse.

$this->layout - nors pačioje klasėje BaseController ši savybė neapibrėžta, bet iš konteksto galime galvoti, kad ji greičiausiai apibrėžta tėvinėje klasėje Controller.

View::make() - štai jums ir statinio metodo pritaikymas, kviečiamas metodas nekuriant naujo objekto (new View).

Taip pat atskirai galima paminėti komentarus virš metodo - jei nesate girdėję apie DocBlock, tai ir yra būtent panašios struktūros komentaras virš metodo ar savybės, kuriame tam tikra griežta struktūra yra surašoma informacija - ką metodas daro, kokius parametrus priima, ką grąžina ir t.t. Privalumai yra du: pagal tokią informaciją su įvairiais įrankiais galima automatiškai pagaminti techninę projekto dokumentaciją (sakykime, naujam programuotojui kad suprastų), o ir šiuolaikinės IDE programos kaip PHPStorm būtent pagal šiuos komentarus išsaugo atmintyje informaciją apie metodą, ir vėliau gali pasiūlyti autocomplete bei kitokius darbo palengvinimus. Tik įrašote metodo pavadinimą - ir jums parodo kokie parametrai reikalingi. Labai patogu.

Symfony

Kitas pavyzdys - paimkime populiarų Symfony frameworką ir pažvelkime į, iš esmės, pirmą pasitaikiusią jo klasę: sakykime, src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php.

namespace Symfony\Bundle\FrameworkBundle\Command;
use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\DependencyInjection\Extension\Extension;
/**
 * A console command for dumping available configuration reference.
 *
 * @author Kevin Bond <kevinbond@gmail.com>
 * @author Wouter J <waldio.webdesign@gmail.com>
 * @author Grégoire Pineau <lyrixx@lyrixx.info>
 */
abstract class AbstractConfigCommand extends ContainerDebugCommand
{
    protected function listBundles(OutputInterface $output)
    {
    	// ...

Iš pirmo žvilgsnio, atrodo sudėtingai ir griozdiškai. Iš dalies, todėl Symfony ir turi tokią reputaciją kaip sudėtingas frameworkas pradedantiesiems. Visgi, pažiūrėjus į šio kodo fragmentą atskirais gabalais - su visomis jo dalimis esame susidūrę šiame kurse:

namespace Symfony\Bundle\FrameworkBundle\Command - vardan tvarkos, šiai klasei priskirtas savo Namespace, kuris iš esmės yra katalogas, kuriame tos klasės failas yra.

use Symfony\Component\Config\Definition\ConfigurationInterface; - kad nereikėtų kiekvieną kartą kviesti šitos ilgos sekos, įtraukiame ją į use.

/* */ - taip pat matome ir DocBlock komentarus, kuriuose parašyti ir klasės autoriai, ir paskirtis.

abstract class - klasė AbstractConfigCommand veiks kaip šablonas dukterinėms klasėms, kurios jau realizuos realų darbą su konfigūracija

protected function - metodas gali būti tik praplėčiamas dukterinėse klasėse

(OutputInterface $output) - metodo parametras yra interfeisas, taip irgi gali būti. Toks principas vadinamas "dependancy injection" - tokiu būdu mes paduodame interfeisą kaip parametrą, kas ateityje leidžia jį pakeisti kitokiu interfeisu, jei to reikės. Gaunamas lankstumas.

CodeIgniter

Ir paskutinį kaip pavyzdį paimkime CodeIgniter, kuris, nors ir po truputį atgyvena, bet yra puikus ir paprastas MVC pavyzdys pradedantiesiems. Pažvelkime į Controller failą application/controllers/Welcome.php:

class Welcome extends CI_Controller {
	/**
	 * Index Page for this controller.
	 *
	 */
	public function index()
	{
		$this->load->view('welcome_message');
	}
}

Palyginus su pavyzdžiais prieš tai, čia viskas paprasčiau. Paprastas extends, vienintelis public metodas, ir $this rodo į savybes, kurios greičiausiai apibrėžtos tėvinėje klasėje CI_Controller. Daugiau turbūt nelabai yra ką komentuoti.

Taigi, apibendrinant šiuos pavyzdžius ir visą kursą, OOP principai yra labai aktyviai naudojami šiuolaikiniuose frameworkuose, bet dabar po šio kurso jūs turite pagrindą po kojomis ir galite rinktis, su kuriuo pradėti dirbti - Symfony, Laravel, Zend Framework ar kt. Primenu, kad Laravel atveju turiu pasiūlyti ir jam skirtą kursą.

Ir pabaigai - siūlau testą iš viso kurso. Sėkmės!



(c) 2015-2018. Visais klausimais kreipkitės povilas@laraveldaily.com