Başka arabirimleri, Özet, ya da bir şey: Nesne yönelimli Ortak Yöntemleri

3 Cevap php

Bu muhtemelen gerçekten basit cevabı - ama tavsiye biraz mutluluk duyacağız.

Benim tüm nesneler aynı yükü () ve loadMultiple () yöntemlerini kullanabilirsiniz küçük bir sistem var. Tam olarak aynı her kod. Çok basit, aşağıda örnek.

public static function load($id) {
	// Instantiate the object
	$object = new self($id);
	return $object;
}

Yukarıdaki örnek kod belli bir arayüz gidemem, ama ben (loadMultiple yönteminde aynı) nesneyi başlatmasını olduğum gibi ne bir soyut sınıf gidebilirsiniz.

Bunun en zarif çözüm nedir? Ben şu anda böyle gibi bir üst sınıf oluşturmak planlıyorum:

 class Object_Model {
    public function load() {
    	// Code here
    }
    public function loadMultiple() {
    	// Code here
    }
}

class Object1 extends Object_Model {
}

class Object2 extends Object_Model {
}

Ama ben daha iyi bir yolu olmalı eminim. Var mı?

3 Cevap

Ben Ionut katılıyorum - sadece geleneksel bir fabrika yöntemi ile gitmek.

<?php
abstract class A
{
  protected $id;

  protected function __construct( $id )
  {
    $this->id = $id;
  }

  final public static function factory( $subclass, $id )
  {
    // Instantiate the object
    if ( is_subclass_of( $subclass, __CLASS__ ) )
    {
      return new $subclass($id);
    }
    throw new Exception( "$subclass is not a valid class for this factory." );
  }
}

class B extends A{}
class C extends A{}
class D{}

try {
  $b = A::factory( 'B', 1 );
  $c = A::factory( 'C', 2 );
  $d = A::factory( 'D', 2 );
}
catch ( Exception $e )
{
  echo "Oops! " . $e->getMessage();
}

Sen late static binding ile bir şey yapmak mümkün olabilir, ama bu PHP 5.3 var sadece

PHP 5.3 kullanıyorsanız eğer gerçekten de çağırdı statik işlevi vardı çocuğun sınıfını belirlemek için bir ana sınıfı ve yeni static anahtar kelime kullanabilirsiniz.

Ancak ben size __construct yöntemi tüm kurulum görevleri yaparken sadece denenmiş ve gerçek new Object1($id); yöntemi kullanılarak kapalı en iyi olduğunu düşünüyorum. Sizin kod okumak ve korumak için biraz daha kolay olacak.

Yük birden fazla örnek sürecini hızlandırmak için dışarı ayrı bir işlevi içine soyut isteyebilirsiniz.

Örneğini sınıfın adını ve id: Geçerli kodu static yöntemi kullanır gibi, ben bu iki argüman alan bir işleve sahip olacağını gayet inanıyorum:

function load($class, $id) {
    return new $class($id);
}

Bu işlevleri kullanarak fabrikaları uygulamak için Tamam. Yoksa orada bir fonksiyon elde edilemez mi daha mantık var mı?