$ Bu, kendini ::, ebeveyn :: kod okunabilirliği için kullanma

6 Cevap php

Bu php sınıfları çalışırken kendini :: yöntem () ve parent :: yöntem () kullanmak için tercih edilen / kabul edilebilir olup olmadığını bilmek istiyorum.

Bu-> yöntemi () $ kullanabilirsiniz ama $ this-> da üst sınıftan bir sınıf değişkeni, bir üst sınıf değişken veya bir yönteme başvurabilirsiniz. Kendini hiçbir belirsizlik yoktur ::

Self :: amortismana tabi ve / veya bu stili kullanarak herhangi uyarılar veya eksileri vardır mı?

Özellikle statik gibi bir fark var gibi görünüyor değil bir yöntemi tanımlamak sürece, o kendini :: ve parent :: sınıf statik bir örneğine bakın, ama Kohana anlamak.

Teşekkürler.

Added an example: Assuming this application stores forums from multiple websites...

class Forum_Controller extends Controller {

    function __construct()
    {
    	parent::__construct();
    }

    function index()
    {
    	echo self::categories();
    }

/*
 * get a list of categories from a specific site.
 */
    private function categories()
    {
    	$db = new Database;
    	$categories = $db->query("
    		SELECT * FROM
    		forum_categories
    		WHERE fk_site = '$this->site_id'
    	");
    	$view = new View('categories_view');
    	$view->categories = $categories;
    	return $view;
    }

}

This examples works in kohana with error reporting set to: error_reporting(E_ALL & ~E_STRICT);

$ This-> site_id ana Controller_Core sınıfı (Kohana bir kütüphane) tanımlanmıştır.

Bildiğim kadarıyla, $ bu statik bir şekilde self :: kategorileri () arıyorum beri mevcut olması gerekiyordu değil, ama ben statik gibi kategoriler () tanımladığınızda bunun bir hata atıyor sadece.

Ama dediğim gibi ben daha ziyade kendini kullanmayı tercih :: bu işlevi olmalıdır tam olarak nerede bir okunabilirlik açısından, ben çok yani bana, belirsizlik neden olan $ this kullanmak yerine, biliyorum çünkü.

6 Cevap

Bunlar statik üye değişkenler / yöntemleri veya sabitleri içerebilir rağmen Kontrolörleri, Kohana statik değildir.

self:: yazmanın bir kestirme yoludur ClassName:: yani

class Animal
{
    public static $arms = 0;
}

class Dog extends Animal
{
    public static $leg = 0;
    const NAME = 'dog';

    public static function bark()
    {
        echo 'Woof';
    }
}

Statik işlevleri çağırmak ya da biz kapsam çözünürlük operatörü :: kullanmak sınıftan sabitleri almak için. Static fonksiyonlar per class nesne değil başınadır. :: bir sınıfın statik örneklerine anlamına gelir yanlış söyleyerek, bu statik yöntemleri erişmek için sadece bir yoludur - bu yöntemleri vardır bir nesne örneği yoktur.

bu yüzden:

Dog::bark(),
Dog::$leg, 
Dog::NAME, 

biz de kullanabilirsiniz

Animal::$arms

Biz tam sınıf adını yazmanız gerekmez, böylece sınıf Dog içinde biz self:: ve parent:: kullanabilirsiniz (bu çok uzun olabilir gibi!)

Sorunuza cevap olsa: Hayır - self:: önerilmiyor değildir ve hiçbir bunu kullanmak için kötü bir uygulama değildir. Bu Kohana çekirdek kullanılmaz nedeni çok farklı bir nedenle .... (eval daha fazla bilgi için aşağıdaki okuma ile şeffaf sınıf uzantıları ...) içindir.

statik olmayan yöntemler arayarak ps statik olan wrong ve izin-eğer edilmemelidir Eğer error_reporting(E_ALL | E_STRICT) set (sizin gibi gelişim sırasında gereken) bir hata ortaya görürsünüz.

Basically what happens is:

Çekirdek adlı bir dosya vardır:

class Controller_Core { 
    public function someMethod(){}
}

Oluşturabilir:

// We can use someMethod of Controller_Core
Index_Controller extends Controller {}

Bu gerçekten Controller_Core UNLESS Eğer class Controller extends Controller_Core olacağını MY_Controller.php oluşturduk genişletiyor.

//MY_Controller.php
class Controller extends Controller_Core
{
      // overloads Controller_Core::someMethod without us having to change the core file
      public function someMethod(){}
}

Bir fark var.

$this bir nesnenin örneğine gelir.

parent ve self statik yöntemleri çağırmak için kullanılır.

This page of PHP's manual ben şu anda yazmak için zaman var daha detaylı bir şekilde anlatıyor. Özellikle ilk örnek farklılıklar bazı vurgulamak için yardımcı olmalıdır. Ben zaten farkı bilmiyorum eğer kafanızda almak için onun önemli bir kavram düşünüyorum ben, onunla ilgili ilk örneği ve karmaşa kopyalayıp yapıştırın öneririz.

Ben kendi kendine :: statik fonksiyonları ve özellikleri için genellikle kullanılır düşünüyorum.

I Kohana kullanımı, ve belki de statik kontrol yapılır.

(Görünüşte i gerekli temsilcisi yok!) Bir yorum eklemek olamazdı

class Forum_Controller extends Controller {

public function __construct()
{
    parent::__construct();
}

public function index()
{
    echo self::categories();
}

/*
 * get a list of categories from a specific site.
 */
private static function categories()
{
    $db = new Database;

    // You cannot use $this in a static function, because static functions are per class 
    // and not per object it doesnt know what $this is :)   (make private static $site_id and use self::$site_id) if this is what you want

    $categories = $db->query("
            SELECT * FROM
            forum_categories
            WHERE fk_site = '$this->site_id'
    ");
    $view = new View('categories_view');
    $view->categories = $categories;
    return $view;
}

}

, | (E_STRICT E_ALL) Dediğim gibi, error_reporting kullanmalısınız (Kohana dosyasında değiştirebilirsiniz)

() statik nedeniyle PHP bir hata için çalışan özel işlev kategorileri çağırarak, bunu yapmak mümkün olmamalı :)

Ben kesinlikle sadece statik değişkenler ve statik üye işlev için kendini :: kullanın

Bu arada dikkat edilmesi gereken başka bir şey bu kategorilerden listelerini dönmek statik kontrolör fonksiyonlarını yapmak için çok iyi MVC tasarım olmasıdır.

Kontrolörler istekleri ile başa çıkmak için, modeller veri ile ilgili içindir (bu ne olduğu) ve Görüntüleme ekran için vardır.

bir model olun!

class Category_Model extends Model
{
      public function categories($site_id)
      {
            $categories = $this->db->from('forum_categories')->where('fk_site',$site_id)->get();

                return new View('categories_view', array('categories' => $categories)); 
      }
}

...

$cat = new Category_Model;

echo $cat->categories(1);