Nesne Erişimi
"ZN Framework'e ait tüm paketler framework dışında da kullanılabilir esneklikte tasarlanmıştır."
ZN Framework'te nesnelere (Library, Model, Controller, Command) genellikle static türde erişim sağlanır. Bunun yanında farklı olarak bir kaç yol daha mevcuttur.
# Bölüm Başlıkları
# Görünümlerde Erişim [5.8.4]
# Parametrik Erişim [5.7.7]
# Statik Erişim
ZN Framework'ün tüm kütüphanelerine statik formda erişilir. Bu yöntemle erişimde herhangi bir kısıtlama yoktur. Erişilecek sınıfların OOP kuralı olarak namespace (isim alanı) içeren sınıflar içerisinde eğer aynı isim alanına sahip değilse çağrımdan önce mutlaka use ile namespace tanımlamasının hemen altında belirtilmelidir. Aksi halde "Class 'ClassName' not found" gibi bir hata ile karşılaşırsınız.
<?php namespace Project\Controllers;
use DB;
class Home extends Controller
{
public function main()
{
output( DB::persons()->result() );
}
}
Kişisel olarak geliştirdiğiniz statik olmayan sınıflara statik erişim sağlayabilmek için ZN Framework 2 farklı yol sunar;
● Sınıf isimlerinin
internal
ön eki ile belirtilmesi.
● Facade sabitinin kullanımı.
internal Ön Eki
Oluşturacağınız sınıfın ismini internal ön eki başlayacak şekilde belirtirseniz sınıfının bir statik görünümü oluşur. Bu statik görünüm ilgili projenin Resources/Statics/ dizinine oluşturulur. İsim alanı (namespace) kullanımı statik erişimi engellemez.
<?php
class InternalMyClass
{
public function run()
{
# Your codes...
}
}
Yukarıdaki tanımlamadan sonra sınıfınızı aşağıdaki gibi kullanabilirsiniz.
<?php namespace Project\Controllers;
use MyClass;
class Home extends Controller
{
public function main()
{
echo MyClass::run();
}
}
MyClass::run() yöntemi statik olarak tanımlanmamasına rağmen bu yönteme erişim statik olarak gerçekleştirilmiştir.
Facade Sabiti [5.7.9]
Oluşturacağınız sınıf bir const facade = 'ClassName' tanımlaması içerirse bu sınıfınızın statik (cephe) görünümü oluşur. Bu kullanımda statik görünüm ilgili sınıfın bulunduğu dizine Facade son eki almış hali ile oluşturulur.
<?php
class MyClass
{
# İsim alanı içermeyen veya aynı isim alanına sahip sınıflar için
# Facade sınıf isminin farklı olmasına dikkat ediniz.
const facade = 'My';
public function run()
{
# Kodlarınız ...
}
}
Yukarıdaki tanımlamadan sonra sınıfınızı aşağıdaki gibi kullanabilirsiniz.
<?php namespace Project\Controllers;
use My;
class Home extends Controller
{
public function main()
{
echo My::run();
}
}
Tanımlamalar Arasındaki Fark
Yukarıdaki tanımlamaların her ikisi de bir statik olmayan bir sınıfa statik olarak erişebilmeyi sağlamasına rağmen arlarında bazı farklar vardır. Bu farklılıklar kullanıma yönelik olmasa bile bilinmesi gereken önemli farklardır.
internal | Facade | |
Dosya İsmi | Sınıfın adı değişir. | Sınıfın adı değişmez. |
İsim Alanı (Namespace) | İsim alanı kullanımından etkilenmez. | İsim alanı kullanımından etkilenir. |
Dosya İsimlendirmesi | internalSınıfAdı.php formunda isimlendirilir. | SınıfAdıFacade.php formunda isimlendirilir. |
Dosya Konumu | Resources/Statics/ | Orijinal sınıf ile aynı konumda yer alır. |
# Sınıf İçi Erişim
ZN Framework'te sınıflara statik erişebileceğiniz gibi kontrolcüler içerisinde $this nesnesi ile de erişebilirsiniz. Erişmek istediğiniz sınıfın isim alanı içermesi $this nesnesi ile erişime engel olmaz. Yani isim alanını belirtmeye gerek kalmadan sadece sınıf adını kullanarak erişim sağlayabilirsiniz. OOP kuralı olarak $this iler erişimde sınıfların use ile isim alanı altında tanımlanmasına gerek yoktur.
<?php namespace Project\Controllers;
class Home extends Controller
{
public function main()
{
output( $this->my->run() );
}
}
Şablon sihirbazı kullanılan görünümlerde $this nesnesine erişim sağlayabilirsiniz.
{{ $this->my->run() }}
# Parametrik Erişim [5.7.7]
Kontrolcü yöntemlerinin parametrelerine nesne enjekte ederek erişim sağlayabilirsiniz.
<?php namespace Project\Controllers;
use My;
use DB;
class Home extends Controller
{
public function main(My $my, DB $db)
{
output( $my->run() );
}
}
Parametre ile oluşturulan sınıf örneklerine aynı değişken isimleri ile görünümlerde erişebilirsiniz.
{{ $my->run() }}