这是我的引导程序文件:
class Bootstrap {
function __construct()
{
$url = $_GET['url'];
//удаляем слеш с конца, чтобы избежать ошибки метода
$url = rtrim($url,'/');
//делим по слешу
$url = explode('/',$url);
//print_r($url);
$file = 'controllers/' . $url[0] . '.php';
if(file_exists($file))
{
require 'controllers/' . $url[0] . '.php';
$controller = new $url[0];
}
else
{
require '/../controllers/error.php';
$error = new error();
$error->classError();
return false;
}
if
(isset($url[2])){
$controller->{$url[1]}($url[2]);
}
else
{
if(isset($url[1])){
if(method_exists($url[0],$url[1])) {
$controller->{$url[1]}();
}
else {
$error->methodError();
}
}
}
}
}
如你所见,我在这里创建了一个对象,并调用了classError函数:
else
{
require '/../controllers/error.php';
$error = new error();
$error->classError();
return false;
}
然后我想在另一个地方调用另一种方法:
else {
$error->methodError();
}
它说: 致命错误:在第39行的Z:\ home \ localhost \ www \ oop \ mvc \ mvc \ libs \ bootstrap.php中的非对象上调用成员函数methodError()。
当我为methodError方法创建另一个对象时,它可以工作。问题是,为什么我要创建另一个对象,如果我已经创建了一个对象?
答案 0 :(得分:1)
您的对象不是为其他条件创建的。
class Test {
private $error;
function __construct() {
$this->error = new error();
}
public function test() {
if( 1 == 1) {
$this->error->methodError();
}
else {
//
$this->error->methodError();
}
}
}
答案 1 :(得分:0)
你的实例化是另一个部分......如果代码永远不会进入else部分怎么办?然后$error
将不确定。
顺便说一下。你不会创建两个对象,只编写代码来实例化对象两次。
答案 2 :(得分:0)
你可以解决这个问题,在if语句之上移动这一行:$error = new error();
。然后,无论在第一个if语句中发生什么,使对象可用于下一个if语句,您的对象都将被创建。
class Bootstrap {
function __construct() {
$url = $_GET['url'];
//??????? ???? ? ?????, ????? ???????? ?????? ??????
$url = rtrim($url,'/');
//????? ?? ?????
$url = explode('/',$url);
//print_r($url);
$file = 'controllers/' . $url[0] . '.php';
$error = new error();
if ( file_exists($file)) {
require 'controllers/' . $url[0] . '.php';
$controller = new $url[0];
} else {
require '/../controllers/error.php';
$error->classError();
return false;
}
if (isset($url[2])) {
$controller->{$url[1]}($url[2]);
} else {
if(isset($url[1])) {
if(method_exists($url[0],$url[1])) {
$controller->{$url[1]}();
} else {
$error->methodError();
}
}
}
}
}
答案 3 :(得分:0)
您在PHP代码不会始终执行的位置创建第一个$ error 作为快速解决方案,您可以再次定义$ error。
else {
require '/../controllers/error.php';
$error = new error();
$error->methodError();
}