Merih Forum Programlama ve yazılım algoritmalar php PSR-4 Autoloader Standardı ve Composer ile Kullanımı

  • 0 Oy - 0 Ortalama
  • 1
  • 2
  • 3
  • 4
  • 5
PSR-4 Autoloader Standardı ve Composer ile Kullanımı

 
#1

Bu arkadaşlar, PHP yapısı kuran kişilere standart olmayı öncülüyorlar. Yani diyorlar ki, bir yapı kuracaksan en azından belirlediğimiz standartlara göre yap ki, bi boka benzesin ? Bende sizlere en basiti olan PSR-4 autoloading olayını anlatacağım.


[Resim: psr4.png?fit=1200%2C675&ssl=1]

Sınıflara yeni başladıysanız namespace’ler size çok anlamlı gelmemiş olabilir. Neden kullanayım ki? Şimdi çok fazla sınıfın kullanıldığı projelerde, sınıf isimlerinin çakışmaması için sınıflara namespace tanımlanır yani nickname gibi düşünün. Benim adım Tayfun, ve aynı sınıfta 2 tayfun daha var. Birbirimizi karıştırmamak için Ben Prototürk Tayfun, Bir diğeri Yufka Yürek Tayfun, bir diğeri Yakışıklı Tayfun ?
Bu şekilde her Tayfun’un nickname’i olunca kimse birbirini karıştırmıyor. İşte namespace’lerde bu amaçla kullanılıyor. Şimdi bu ne alaka diyebilirsiniz, bende bilmiyorum ufaktan bi bilgi vereyim dedim ? Bizim asıl konumuz, sınıflarımızı nasıl otomatik yükleteceğiz.
Normalde yaptığımız
Eskiden __autoload() fonksiyonunu kullanıyorduk, ancak bu PHP 7.2 ile önerilmemeye başlandı. Yerini spl_autoload_register() fonksiyonu aldı. Bunu nasıl kullanıyoruz;
spl_autoload_register(function($class){
   $file = __DIR__ . '/src/classes/' . strtolower($class) . '.php';
   if (file_exists($class))
       require $class;
});

Fakat bu yeterli gelmiyor. Ve çokta doğru bir mantık sayılmaz. Başka klasörlerde başka sınıflarımda olabilir. Dolayısı ile bunu sadece biz sorun etmemişiz belli ki, bu FIG bizim için PSR-4 adını verdikleri autoloading standardını belirtmişler. Onlara göre bu işlemi yaparken şunlar olmalı;
\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
Yani sınıflar bir top-level namespace’e sahip olmalılar. Ayrıca vendor namespace olarakta biliniyormuş bu.
Ve ek olarak 1 ya da daha fazla alt namespace’e sahip olması gerekiyormuş.
E tabi birde sınıf ismi ?

Bu arkadaşların mantığına göre işlemimi şöyle yaparsak;
spl_autoload_register(function($class){

   // top-level namespace
   $prefix = 'Erbilen\';

   // namespace için ana dizin
   $base_dir = __DIR__ . '/src/libraries/';

   // çağırılan sınıf prefix'i içermiyorsa bir sonraki yükleme işlemine geç
   $len = strlen($prefix);
   if (strncmp($prefix, $class, $len) !== 0){
       return;
   }

   // prefix hariç sınıfın kalanı
   $relative_class = substr($class, $len);

   // hepsini birleştirip dizin yolunu oluştur
   $file = $base_dir . str_replace('\', '/', $relative_class) . '.php';

   // sınıf dosyası var ise yükle
   if (file_exists($file))
       require $file;

});

// Aslında bu sınıf şurada yer alıyor
// src/libraries/validators/testvalidator.php
$test = new Erbilen\Validators\TestValidator();

// src/libraries/database/testdatabase.php
$db = new Erbilen\Database\TestDatabase();

Composer ile Kullanımı?
Eğer bu işlemi composer ile yapmak isterseniz, composer.json dosyasını açın yoksa bir tane oluşturun anadizinde ve içine şu kodları yazın;
{
 "autoload": {
   "psr-4": {
     "Erbilen\": "src/libraries"
   }
 }
}

Burada yine gördüğünüz gibi ilk değerimiz top-level namespace’imiz ve karşılığı olarak namespace’in bulunduğu ana dizini belirttik. Terminale gidip 
Kod:
composer update

 komutunu çalıştırdığınızda ana dizinde 

Kod:
vendor

adında bir klasör ve onun içinde 

Kod:
autoload.php

 olduğunu göreceksiniz. Ayrıca birde 

Kod:
composer

 diye klaör var, işlemleri burada yapıyor ancak biz index dosyamızda bu autoload.php’yi çağırıyoruz. Ve sınıflarımızı kullanmayı deniyoruz.

<?php
require __DIR__ . '/vendor/autoload.php';

$test = new Erbilen\Validators\TestValidator();
$db = new Erbilen\Database\TestDatabase();

Sonuç? Evet, çalışıyor. Tebrik ederim, ilk standardı kullanmayı başardık, darısı diğerlerinin başına.



Bul
Alıntı


Benzer Konular...
Konu: Yazar Cevaplar: Gösterim: Son Mesaj
  php register_globals kullanımı Deli Profesör 0 719 10-02-2021, Saat: 23:08
Son Mesaj: Deli Profesör
  PHP Statik Değişken Kullanımı kıllıbacak 0 1,105 23-03-2019, Saat: 23:54
Son Mesaj: kıllıbacak
  PHP – PHP’DE FORM İŞLEMLERİ POST VE GET METODLARININ KULLANIMI sempatik141 1 4,463 17-06-2017, Saat: 21:13
Son Mesaj: alifurkan
  Php ile Google Maps Api Kullanımı Adamantin 0 2,569 19-03-2017, Saat: 18:55
Son Mesaj: Adamantin

Digg   Delicious   Reddit   Facebook   Twitter   StumbleUpon  


Bu konuyu görüntüleyen kullanıcı(lar):
1 Ziyaretçi

   
Türkçe Çeviri: Emre KRMN, Kodlayanlar MyBB, © 2002-2024 MyBB Group.  



Merih Forum® bilgi paylaşım platformu. 2015-∞ Tüm hakları saklıdır.