【问题标题】:Global object within include of an include包含在包含中的全局对象
【发布时间】:2012-08-16 19:56:54
【问题描述】:

正确的-o

我对 OOP 还很陌生。

我正在使用 PHP v5+

我有我的 index.php:

<?
include_once('class/includes.php');
$reg = new register;
$action = $_GET['action'];
$page = $_GET['page'];
include('header.php');
if($page):
include($page);
else:
include('home.php');
endif;
include('footer.php');
?>

我设置了我的 htaccess,以便每个页面的 url 是 foo.com/pagename

没关系。

在我的 classes.php 页面 (foo.com/classes) 上,默认包含 viewClasses.php //note classes指的是瑜伽课而不是OOP课

所以基本上我有 2 个级别的包含(index.php 包括 classes.php,其中包括 viewClass.php)

这是我的 viewClass.php

<?
global $reg;
$reg->viewClassList();
echo $reg->classList;

?>

由于某种原因,它没有按照 index.php 中的定义获取 $reg,因此给了我这个错误:

致命错误:在第 3 行的 /home/pandazco/public_html/register/viewClass.php 中的非对象上调用成员函数 viewClassList()

我希望这能很好地解释我的问题...

【问题讨论】:

  • 你应该阅读Local File Inclusion
  • 你不需要在那里声明global $reg。它已经公开为$reg,除非它在函数内部。但是,您有一个更大的问题。这很容易受到巨大的目录遍历攻击!您盲目地包含$page 指向的任何内容,这可能会将您系统的密码文件转储到屏幕上。您必须至少过滤$page../ 等字符或http://ftp:// 等远程协议。
  • 有什么更好的方法?只需设置每个变量(即) if($page = pagea): include pagea;万一; if($page = pageb): 包含 pageb;万一; if($page = pagec): 包含 pagec; endif;
  • @MatTaylor 最好通常使用可能值的白名单if (in_array($page, array('page1','page2','page3')) 如果 $page 不在允许的字符串数组中,请不要包含它。
  • 为此干杯,目前它将在本地离线托管,但有可能会在更远的地方附加到客户网站,将使用它,干杯:)

标签: php oop include globals


【解决方案1】:

问题似乎是您没有在 viewClass.php 中包含实例化,这意味着 $reg 什么都不是。这就是错误告诉您的内容。

但是我永远不会使用全局变量,事实上我很确定有很多关于不使用它们的冗长讨论。相反,如果您需要在不同的 php 脚本之间传递数据,我会设置一个会话变量并从中读取。

另外,您为什么还要使用 $reg 作为全局变量?您似乎所做的只是在 index.php 中实例化它并尝试在 viewClass.php 中调用它。你到底想达到什么目的?

【讨论】:

  • 好点,我只是想为那里的任何页面实例化 $reg,所以我应该逐页进行吗?我正在在线注册瑜伽课程
  • 同意:全局变量。全局变量从来都不是必需的。事实上,它们会导致代码脆弱,并且是做错的标志。在封装是关键的 OOP 上下文中,这尤其令人震惊。
  • 如果不确切知道您的寄存器类是做什么的,很难说。我从您的方法名称中假设您正在返回一组数据。假设数据来自数据库,您可能不想在每个页面请求上继续调用新实例,如果返回的数据不经常更改,您可能会发现最好调用一次并将其保存在会话变量中并拉取它必要时返回。但是,这实际上取决于您的班级所做的事情,因为将过多的数据放入会话中也不是明智之举。
猜你喜欢
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 2020-01-10
  • 2017-01-15
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多