类继承问题

时间:2010-04-28 14:18:04

标签: php

我有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中的功能修改是什么?

5 个答案:

答案 0 :(得分:5)

这不是继承。 B.php包含 A.php。这意味着A.php中的所有代码都可用于B.php的执行上下文。

继承是一种类关系

class A{}

class B extends A{}

B类可以说是来自A的继承。因此,已经形成了一个层次结构。

就像我们人类从父母那里继承特征一样,类继承了他们的父母的属性。出于这个原因,根据它们在层次结构中的位置来讨论这些类是非常。 A类是B类的 .B类是A类的

但是您遇到的实际问题(错误消息的来源)是一个范围问题。您在全局范围内创建$a但尝试从函数范围内访问它,在本例中为testing()

解决此问题的最佳方法是将myClass的实例传递到testing()

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

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

回答你的最后一个问题 - 在PHP5中 - 未使用访问修饰符显式声明的类成员隐式public

答案 1 :(得分:2)

如果你想在函数中使用$ a,你需要放

global $a;

作为该函数的第一行,或将其作为$GLOBALS['a']

访问

答案 2 :(得分:2)

使用此

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

答案 3 :(得分:1)

我相信函数中没有定义$a。首先尝试使用global $ a,然后调用hello()。

答案 4 :(得分: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不在函数testing()的范围内。请允许我重新安排你的程序,你会明白为什么。你可以写它,就像这样:

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