php 5.4 array dereferencing

php 5.4 ile gelen yeni özelliklerden biri de, array döndüren metodları kullanırken kolaylık sağlıyor.
Aşağıdaki örnekte getData metodu, array döndüren bir metod. Ve metodu çağırır çağırmaz ise, array keyini yazıp hemen dönen sonucu kullanabiliyoruz.

Tabi burada tanımsız ise hata almanız kaçınılmaz, bu yüzden yanlış veya olmayan bir key’i çağırmamaya dikkat etmeniz şart. Çok da hata bakımından kontrol edilebilir bir şey değil çünkü bu.

function getData() {
    return ['firstname' => 'Emre', 'lastname' => 'Macit'];
}

echo getData()['firstname'];

php 5.4 callable typehint

Php 5.4 te gelen yeni bir özellik de “callable” typehinti.
Callable ile , “çağrılabilir” bir parametre geleceğini ifade etmiş oluyorsunuz. ve istediğiniz zaman bunu çağırabiliyorsunuz.

class Meyve
{
    function __construct($name)
    {
        $this->name = $name;
    }

    public function selam()
    {
        return "Selam " . $this->name;
    }
}
//fonksiyonumuzu tanımlarken $f yi callable olarak cast ediyoruz. (hint ediyoruz)
function selam(callable $f) {
//ve bu şekilde çağırabiliyoruz.
    $f();
}

selam([new Meyve("Armut"), 'selam']);

Php 5.4 Sinif Metoduna Hizli Erisim

php 5.4 ile birlikte sınıf metodlarına hızlıca erişimin de önü açıldı. böylece 2 satırda yapacağımız işleri artık tek satırda yapabiliyoruz.

class Araba
{
    public $name;
    function __construct($name)
    {
        $this->name = $name;
    }

    public function selam()
    {
        return "Selam " . $this->name;
    }
}

// eski stil
$araba = new Araba("Mersedes");
echo $araba->selam();

// yeni harika stil
echo (new Araba("Ferrary"))->selam();

PHP Namesapace Autoload

Merhaba,

PHP 5.3.x ile beraber gelen namespace konusuna bu yazımda değinmiştim. Şimdi namespace autoload konusuna değinerek sizlere bilgilerimi paylaşmak istiyorum.

Koskoca bir proje tek bir include ile olur mu demeyin oluyor. Kullanmak istediğimiz namespace’yi use diyerek çağırmak ve ilgili sınıfın otomatik olarak include edilmesi için autoload mekanizması var. Şimdi bu yapıyı kurmak için proje dizinimize composer.json dosyası oluşturarak içine şu jsonu ekleyelim :

{

   "autoload":{
      "psr-0":{
         "" : "library" // sınıflarımın bulunduğu path (index.php ile aynı seviyede)
      }
   }
}

Not : composer işletim sisteminizde yüklü olmalıdır (ubuntu için curl -s https://getcomposer.org/installer | php)

Şimdi komut satırından proje dizinine gelerek şu komutu çalıştıralım ve ilgili dosyalarımızı oluşturalım :

composer install

Bu komutu çalıştırdıktan sonra vendor isminde bir klasör ve içerisine iligli dosyalar gelmiş olacak.Aynı zamanda composer ile uğraşmak istemiyorsanız internetten çeşitli kaynaklardan bu vendor içindeki dosyaları edinebilir veya kendiniz yazabilirsiniz. Nihayetinde PHP dosyaları ve composer sadece bu işi kolaylaştıran bir yapı.

Şimdi kullanımına gelecek olursak index.php dosyamıza vendor klasörü içindeki autoloader.php dosyamızı include etmek dışında hiçbirşey kalmıyor 🙂

PHP Namespace

Merhaba,

Nedir bu namespace diyerek Google’nin başına geçmiş, araştırmalar yapmış ve tam olarak kafanıza oturmadan çalışmaları sonlandırmış olabilirsiniz. Biraz gerçekçi senaryolar üzerinden giderek sonuca ulaşmaya çalışalım.

– library

– Form

– Data.php (class Data)

– Database

– Data.php (class Data)

Şeklinde iki adet Data.php dosyalarına tanımlanmış Data isimli sınıflarımız var. Buraya kadar sorun yok. Şimdi bunları aynı sayfa üzerinde çalıştırmaya çalışalım.

<?php

require_once('library/Form/Data.php');

require_once('library/Database/Data.php');

$object1 = new Data();

$object2 = new Data();

?>

İşte burada işler karıştı ve fatalı yediniz. PHP size kızdı. Muhtemelen kullandığınız IDE bile size kızdı. Yazıklar olsun dedi. PHP 5.3.x ile beraber gelen namepsace bu konuda bize çözüm sağlıyor.

library/Database/Data.php :

<?php

namespace Database;

class Data{

}

?>

library/Form/Data.php

<?php

namespace Form;

class Data{

}

?>

Şimdi namepsace ile doğru kullanımına geçelim

<?php

require_once("library/Database/Data.php");

require_once("library/Form/Data.php");

$object1 = new \Database\Data();

$object2 = new \Form\Data();

?>

Evet şimdi işlet tıkırında giti ve PHP’de IDE’de kızmadı bize. Çalıştı. Eğer namespace kullanmamış olsaydık 2. Data classımız için Data yerine başka belkide anlamsız bir isim vermek zorunda kalacaktık. Özellikle büyük çaplı projelerde iç içe klasör yapıları ve classlar ile daha anlamsız class isimleri oluşturmak durumunda kalacaktık. Buda kod okunurluğunu ve OOP yapısına uygun olmayan sonuçlar doğurabilirdi.

Umarım faydalı olmuştur.