Sınıf Kalıtım Sorunu

5 Cevap

Ben A.php ve B.php var

A.php

<?php
error_reporting(E_ALL);
ini_set("display_errors",1);
class myClass
{
  function hello()
  {
    return 'hello';
  }  
}
?>

B.php

<?php
error_reporting(E_ALL);
ini_set("display_errors",1);
require_once('/A.php');
$a = new myClass();
testing();

function testing()
{    
    echo $a ->hello();
}
?>

B.php inherits A.php , if i run B.php,but it show "Fatal error: Call to a member function hello() on a non-object."

Yani soru ben bu nasıl düzeltebilir, basit, ama "$ a = new myClass ();" içinde. NET dünya yapabilirsiniz beri, işlev içinde değil, ben PHP de mümkündür inanıyorum.

I kamu / özel / korumalı devlet varsa Ve bir soru daha, A.php yılında fonksiyon Değiştir olan ne?

5 Cevap

Ben burada değiştirmek istiyorum şeylerin bir çift, ben bir an anlatacağım.

A.php

<?php
error_reporting(E_ALL);
ini_set("display_errors",1);

class myClass
{
  // Here, access modifier.
  public function hello()
  {
    return 'hello';
  }  
}
?>

B.php

<?php

error_reporting(E_ALL);
ini_set("display_errors",1);

require_once('/A.php');
testing();

function testing()
{   
    // Here, change where variable is defined to place it in scope.
    $a = new myClass();
    echo $a ->hello();
}
?>

hiçbir erişim belirleyici bir yöntem verilmiştir, bu varsayılan public. Ancak, sadece yöntem olmasını istediklerini bildirmek için genellikle daha iyidir. Eğer her bir farklı bir varsayılan olacak gibi kendinizi aktif birden fazla dilde kodlama bulursanız bu takdir edecektir.

Şu anda değişken $a fonksiyon testleri () kapsamında değildir. Bana programını yeniden düzenlemek için izin ve neden göreceğiz. Bunu gibi, bunu yazdım olabilir:

B.php

<?php
function testing()
{       
    echo $a ->hello();
}    

error_reporting(E_ALL);
ini_set("display_errors",1);

require_once('/A.php');
$a = new myClass();
testing();

?>

Bu testing() hemen $a yok, tanımlandığı gibi olduğu, bkz. Henüz tanımlı değil. Yani testing() 'nin kapsamı içinde değildir. Sen $a testing() içinde tanımlamak veya başka bir parametre olarak geçmek ya var olacak. Benim ilk geçişte, ben $a içeride testing() tanımlamak için kodunuzu değişti. Birden fonksiyonları kullanmak gerekiyorsa, o zaman testing() parametre olarak almak değişen öneririm. Bu gibi:

function testing(myClass $a) {
    echo $a->hello();
}

Sonra bu şekilde geçmek:

$a = new myClass();
testing($a);

Bu miras değil. B.php, sadece includes A.php. Bu A.php B.php yürütme bağlamında kullanılabilir hale tüm kod anlamına gelir.

Inheritance bir sınıf ilişkisi

class A{}

class B extends A{}

Sınıf B inherit A. Yani, bir hiyerarşi oluşmuştur söylenebilir.

Biz insanlar bizim anne özellikleri miras kadar, sınıfları their anne özellikleri devralır. Bu nedenle, bu hiyerarşide onların yerine açısından bu sınıflar hakkında konuşmak very yaygındır. A sınıfı bir child sınıfına A. a parent class B. Sınıf B için

Ama yaşıyorsanız asıl sorun, hata mesajının kaynağı, bir kapsam konudur. Sen genel kapsamda $a oluşturmak ama bu durumda, bir işlevin kapsamına onu erişmeye çalışırsanız testing().

Bunu çözmek için en iyi yolu, testing() içine myClass örneklerine geçmektir

$a = new myClass();
testing( $a );

function testing( $myClassObj )
{    
    echo $myClassObj->hello();
}

Ve son soru cevap - PHP5 - açıkça bir erişim değiştiricisi ile bildirildiğini değil sınıf üyeleri örtülü olmak public.

Eğer fonksiyonu $ a kullanmak istiyorsanız, koymak ya da gerek

global $a;

$GLOBALS['a'] olarak ilk işlevi doğrultusunda, ya da ulaşabildikleri gibi

Bu kullanabilirsiniz

function testing()
{   
    global $a;
    echo $a ->hello();
}

I $a fonksiyonunda tanımlı olmadığına inanıyorum. Global $ a ilk kullanan, ve sonra () merhaba aramayı deneyin.