2010-04-28 4 views
0

У меня A.php и B.phpкласса Наследование Проблема

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 наследует a.php, , если я запустите B.php, но он показывает «Неустранимая ошибка: вызов функции-члена hello() для не-объекта».

Итак, вопрос прост, как я могу исправить это, но «$ a = new myClass();» не находится внутри функции, так как в .NET мир может это сделать, я считаю, что PHP также возможен.

И еще один вопрос: что такое изменение функции в A.php, если у меня нет государственной/общественной/защищенной?

+1

Это не удел. Это проблема с переменными scope, модификаторами файлов и модификаторами доступа к моделям. –

ответ

1

Несколько вещей, которые я бы изменить здесь, я объясню в минуту.

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(); 
} 
?> 

При отсутствии спецификатора доступа не дается по методу, по умолчанию public. Однако, как правило, лучше просто объявить, что вы хотите, чтобы метод имел. Вы оцените это, если обнаружите, что активно кодируете на нескольких языках, поскольку каждый из них будет иметь разные значения по умолчанию.

Прямо сейчас переменная $a не входит в сферу действия функции(). Позвольте мне изменить вашу программу, и вы поймете, почему. Вы могли бы написать это, например, так:

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(); 

?> 

Вы видите, где testing() теперь определено, $a не существует. Он еще не определен. Так что это не внутри области testing(). Вам нужно либо определить $a внутри testing(), либо передать его в качестве параметра. В моем первом проходе я изменил код, чтобы определить $a внутри testing(). Если вам нужно будет использовать его в нескольких функциях, я бы предложил изменить testing(), чтобы принять его как параметр. Как это:

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

Затем передать его таким образом:

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

Я считаю, что $a не определен в функции. Попробуйте сначала использовать глобальный $ a, а затем вызовите hello().

2

Если вы хотите использовать $ а в функции, вам необходимо либо поместить

global $a; 

в первой строке функции, или доступ к нему, как $GLOBALS['a']

+0

Я бы предпочел, чтобы он просто объявлял его внутри функции, чем сделал его глобальным и доступ к нему через массив глобальных ... –

5

Это не удел. B.php всего содержитA.php. Это означает, что весь код в A.php становится доступным для контекста выполнения B.php.

Наследование класс отношения

class A{} 

class B extends A{} 

класса B, можно сказать, наследуют от А. Таким образом, иерархия была сформирована.

Как мы, люди наследуем черты от наших родителей, классы наследуют свойства от их родителей. По этой причине очень, чтобы говорить об этих классах с точки зрения их места в иерархии. Класс А является родителем к классу B. Класс B является ребенком к классу А.

Но актуальной проблеме вы имеете, источник сообщения об ошибке, это вопрос сферы. Вы создаете $a в глобальной области действия, но пытаетесь получить к нему доступ из области видимости функции, в данном случае testing().

Лучший способ решить это, чтобы передать ваши экземпляры myClass в testing()

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

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

И ответить на ваш последний вопрос - в PHP5 - члены класса явно не объявлен с модификатором доступа становится неявно public.

+0

Спасибо вам большое. – Cheung

2

использование этого

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