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