2010-04-01 25 views
72

PHP'de soyut bir sınıf nedir? Nerede kullanılabilir?php'de soyut sınıf nedir?

+1

* (referans) * http://de2.php.net/manual/en/language.oop5.abstract.php – Gordon

+2

* (ilgili) * http: // stackoverflow.com/questions/2288467/what-is-the-amaçlı-of-the-class sınıf – Gordon

+4

@Gordon: Bazen resmi dokümanlar bazı insanlar için bu kadar net değildir :( – Sarfraz

cevap

87

Soyut sınıf, içinde gerçek bir kod bulunmayan, yalnızca ad ve parametreler olan ve "soyut" olarak işaretlenmiş en az bir soyut yöntem içeren bir sınıftır. Bunun amacı, soyut metodları uygulamak için miras sınıfını miras almak ve bunlardan miras almak için bir şablon sağlamaktır.

Özet bir sınıf, normal sınıf ve salt bir arayüz arasında bir şeydir. Ayrıca arayüzler, TÜM yöntemlerin soyut olduğu özel bir sınıf sınıflarıdır.

Daha fazla referans için PHP kullanım kılavuzunun this section numaralı adresine bakın.

+3

[Bu konu] 'da (http://stackoverflow.com/questions/254514/php-and-enumerations) özet, soyut bir yöntem içermemektedir. – r0ng

+1

@ r0ng Soyut bir sınıfın * soyut yöntemler içerdiğini ve soyut yöntemlerin her zaman soyut bir sınıf içinde olması gerektiğini söylemek daha doğru olur. Aklımdaki tanımlayıcı pratik özellikler, soyut bir sınıfın örneklenememesidir, ancak yöntemleri devralıp üzerine yazabilir ve soyut bir sınıftan statik yöntemler normal olarak kullanılabilir. – Fx32

13

An abstract class is a class that is only partially implemented by the programmer. It may contain one or more abstract methods. An abstract method is simply a function definition that serves to tell the programmer that the method must be implemented in a child class.

o here iyi bir açıklaması var.

+0

@Sarfraz Bu arada sihirli çeviriciyi de seviyorum. Almanya'da çalışacak olan herhangi bir şans? –

+0

@Pekka, n sahte denemeden sonra sim kartınızı otomatik olarak kilitleyeceğinize eminim. – Gordon

+0

@Gordon crap. Sonunda 2 yıllık sözleşme zincirlerimden kurtulmayı umuyordum :) Bu makaleyi nasıl beğendim tarihli * 27 Mart * –

5

Bağlantı: Abstract Class in Php and oops

  • Özet Sınıf yalnızca yöntemin imzasını beyan içerir, bunlar uygulanmasını tanımlayamazsınız.
  • Özet sınıfı, özet anahtar sözcüğü kullanılarak tanımlanır.
  • Özet Sınıfı çoklu kalıtım uygulamak mümkün değildir.
  • PHP 5'in son sürümü, soyut sınıfları ve yöntemleri tanıttı. özet olarak tanımlanan sınıflar olmayabilir: özet olarak tanımlanan
  • Sınıflar, biz

http://www.codingslover.com/2015/07/abstract-class-in-php.html

56

Abstract classes are classes that contain one or more abstract methods. An abstract method is a method that is declared, but contains no implementation. Abstract classes may not be instantiated, and require subclasses to provide implementations for the abstract methods.

1. soyut sınıf örneğini edebilir (örneği değil) bir nesne oluşturmak için mümkün olan örneklenmiş olmalı ve en az bir soyut yöntem içeren herhangi bir sınıf da soyut olmalıdır. Aşağıdaki

Örnek:

abstract class AbstractClass 
{ 

    abstract protected function getValue(); 
    abstract protected function prefixValue($prefix); 


    public function printOut() { 
     echo "Hello how are you?"; 
    } 
} 

$obj=new AbstractClass(); 
$obj->printOut(); 
//Fatal error: Cannot instantiate abstract class AbstractClass 

2., özet olmalıdır en az bir arka yöntemi içeren herhangi bir sınıf: Özet sınıfı soyut olmayan arka yöntemlere sahip olabilir, ama en az bir içermelidir soyut yöntem. Bir sınıf en az bir soyut yönteme sahipse, sınıfın soyut olarak beyan edilmesi gerekir. Aşağıdaki

Note: Traits support the use of abstract methods in order to impose requirements upon the exhibiting class.

Örnek:

class Non_Abstract_Class 
{ 
    abstract protected function getValue(); 

    public function printOut() { 
     echo "Hello how are you?"; 
    } 
} 

$obj=new Non_Abstract_Class(); 
$obj->printOut(); 
//Fatal error: Class Non_Abstract_Class contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Non_Abstract_Class::getValue) 

3. soyut bir yöntem gövdesi içeremez: özet olarak tanımlanan yöntemler sadece yöntemin imza ilan - bunlar uygulama tanımlayamaz. Ancak soyut olmayan bir yöntem uygulamayı tanımlayabilir.

abstract class AbstractClass 
{ 
    abstract protected function getValue(){ 
    return "Hello how are you?"; 
    } 

    public function printOut() { 
     echo $this->getValue() . "\n"; 
    } 
} 

class ConcreteClass1 extends AbstractClass 
{ 
    protected function getValue() { 
     return "ConcreteClass1"; 
    } 

    public function prefixValue($prefix) { 
     return "{$prefix}ConcreteClass1"; 
    } 
} 

$class1 = new ConcreteClass1; 
$class1->printOut(); 
echo $class1->prefixValue('FOO_') ."\n"; 
//Fatal error: Abstract function AbstractClass::getValue() cannot contain body 

4. soyut sınıfından miras, tüm yöntemler ebeveynin sınıf bildiriminde soyut olarak işaretlenmiş çocuk tarafından tanımlanmalıdır: Bir soyut sınıf miras Eğer tüm soyut yöntemlere uygulamaları sağlamak zorunda içinde.

abstract class AbstractClass 
{ 
    // Force Extending class to define this method 
    abstract protected function getValue(); 

    // Common method 
    public function printOut() { 
     print $this->getValue() . "<br/>"; 
    } 
} 

class ConcreteClass1 extends AbstractClass 
{ 
    public function printOut() { 
     echo "dhairya"; 
    } 

} 
$class1 = new ConcreteClass1; 
$class1->printOut(); 
//Fatal error: Class ConcreteClass1 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue) 

5. Aynı (veya daha az kısıtlı) görüş: bir soyut sınıfından miras, tüm yöntemler, çocuk tarafından tanımlanmış olmalıdır ebeveynin sınıf bildiriminde özet işaretlenmiş; ek olarak, bu yöntemler aynı (veya daha az kısıtlı) görünürlük ile tanımlanmalıdır. Örneğin, soyut yöntem korumalı olarak tanımlanırsa, işlev uygulaması korunan veya genel olarak tanımlanmalı, ancak özel değil. soyut yöntemlerden

Note that abstract method should not be private.

abstract class AbstractClass 
{ 

    abstract public function getValue(); 
    abstract protected function prefixValue($prefix); 

     public function printOut() { 
     print $this->getValue(); 
    } 
} 

class ConcreteClass1 extends AbstractClass 
{ 
    protected function getValue() { 
     return "ConcreteClass1"; 
    } 

    public function prefixValue($prefix) { 
     return "{$prefix}ConcreteClass1"; 
    } 
} 
$class1 = new ConcreteClass1; 
$class1->printOut(); 
echo $class1->prefixValue('FOO_') ."<br/>"; 
//Fatal error: Access level to ConcreteClass1::getValue() must be public (as in class AbstractClass) 

6. İmzalar eşleşmelidir: Bir soyut sınıfından miras, tüm yöntemler çocuk tarafından tanımlanması gerekir ebeveynin sınıf bildiriminde soyut olarak işaretlenmiş; yöntemlerin imzaları eşleşmelidir, yani tip ipuçları ve gerekli argümanların sayısı aynı olmalıdır. Örneğin, çocuk sınıfı, soyut yöntemin imzasının bulunmadığı isteğe bağlı bir argümanı tanımlarsa, imzasında herhangi bir çatışma yoktur.

abstract class AbstractClass 
{ 

    abstract protected function prefixName($name); 

} 

class ConcreteClass extends AbstractClass 
{ 


    public function prefixName($name, $separator = ".") { 
     if ($name == "Pacman") { 
      $prefix = "Mr"; 
     } elseif ($name == "Pacwoman") { 
      $prefix = "Mrs"; 
     } else { 
      $prefix = ""; 
     } 
     return "{$prefix}{$separator} {$name}"; 
    } 
} 

$class = new ConcreteClass; 
echo $class->prefixName("Pacman"), "<br/>"; 
echo $class->prefixName("Pacwoman"), "<br/>"; 
//output: Mr. Pacman 
//  Mrs. Pacwoman 

7. Özet sınıf çoklu kalıtım desteklemez: Soyut sınıf kutu, Soyut sınıf birden mirası desteklemez interface.But uygulanmasını sağlayabilir başka soyut sınıfını genişletir. Önemli hata neden olacaktır Örneğin aşağıda

interface MyInterface{ 
    public function foo(); 
    public function bar(); 
} 

abstract class MyAbstract1{ 
    abstract public function baz(); 
} 


abstract class MyAbstract2 extends MyAbstract1 implements MyInterface{ 
    public function foo(){ echo "foo"; } 
    public function bar(){ echo "bar"; } 
    public function baz(){ echo "baz"; } 
} 

class MyClass extends MyAbstract2{ 
} 

$obj=new MyClass; 
$obj->foo(); 
$obj->bar(); 
$obj->baz(); 
//output: foobarbaz 

Note: Please note order or positioning of the classes in your code can affect the interpreter and can cause a Fatal error. So, when using multiple levels of abstraction, be careful of the positioning of the classes within the source code.

:

class cart extends horse { 
    public function get_breed() { return "Wood"; } 
} 

abstract class horse extends animal { 
    public function get_breed() { return "Jersey"; } 
} 

abstract class animal { 
    public abstract function get_breed(); 
} 

$cart = new cart(); 
print($cart->get_breed()); 
6

Özet Class
1. bulunamadı Class 'atı' soyut bir yöntem içerir
2. olamaz doğrudan başlatıldı
3. Özet sınıfının bir nesnesi oluşturulamıyor
4. Sadece miras amacıyla

Özet Yöntem kullanılan
1. Bir gövdeyi ihtiva edebilir
2. soyut sınıf
bildirilen yöntemler tanımlamalıdır özel
3. Çocuk sınıfları olarak tanımlanamaz

Örnek Kod:

abstract class A { 
    public function test1() { 
     echo 'Hello World'; 
    } 
    abstract protected function f1(); 
    abstract public function f2(); 
    protected function test2(){ 
     echo 'Hello World test'; 
    } 
} 

class B extends A { 
    public $a = 'India'; 
    public function f1() { 
     echo "F1 Method Call"; 
    } 
    public function f2() { 
     echo "F2 Method Call"; 
    } 
} 

$b = new B(); 
echo $b->test1() . "<br/>"; 
echo $b->a . "<br/>"; 
echo $b->test2() . "<br/>"; 
echo $b->f1() . "<br/>"; 
echo $b->f2() . "<br/>"; 

Çıktı:

Hello World 
India 
Hello World test 
F1 Method Call 
F2 Method Call 
+0

alt koruma nesnesini alt sınıf nesnesine göre çağıramazsınız, bu nesneyi kullanarak alt sınıf yöntemini çağırabilirsiniz echo $ b-> test2(). "
"; –