【问题标题】:PHP can't use variable defined outside functionsPHP 不能使用在函数外部定义的变量
【发布时间】:2012-03-04 10:08:29
【问题描述】:

我正在做一个项目(简单的 XML CMS),只是为了学习一些基本的 PHP。

首先我包含一个 config.php 文件,其中包含有关 CMS 的信息,然后我包含一个用于 URL 路由的 route.php,然后我包含一个与 WordPress 非常相似的 functions.php 文件(包含所有功能,例如加载帖子、标签、类别等)。

结构如下:

<?php
    function latestProducts($amount = 6){
    }

    function products($search = FALSE, $query= '', $page = 1, $results = 5){
    }

    function getProductById($id){
    }

    function getProductTitleById($id){
    }

    function getProductByExcerpt($excerpt){
    }

    function getProductTitleByExcerpt($excerpt){
    }

    function getPost($id, $title, $description, $category, $excerpt = FALSE){
    }

    function getTitle(){
    }

    function breadcrumb($params, $first){
    }

    function pagination($page, $pages){
    }
?>

在 config.php 文件中我也使用了这段代码:

$xml = simplexml_load_file("products.xml") or die("The product XML file couldn't be loaded.");

但是当我尝试从我在functions.php 中准备的函数中访问$xml 时,我得到了一个未定义的变量通知。 (我也尝试在函数定义之前将 $xml 变量放在 functions.php 中,但得到了相同的结果。)

我的错误是什么?我知道这很简单;我现在看不清楚。

【问题讨论】:

    标签: php xml function variables undefined


    【解决方案1】:

    您有一个范围界定问题。在全局范围内声明的变量在你的函数中是不可见的。 The manual 解释了你可以做些什么。概述:

    • 在函数开头使用global $xml; 将变量从全局作用域导入到函数的局部作用域中
    • 将变量存储为全局变量超全局的键,即$GLOBALS['xml']
    • 使变量成为类的静态成员或创建单例构造
    • 将变量作为参数传递给需要它的每个函数

    请注意,当使用良好的 OOP 风格架构时,这些问题通常可以避免,例如$xml 将是需要直接访问 DOM 对象的类实例的属性。

    【讨论】:

    • 非常感谢您的快速回答!
    【解决方案2】:

    函数或方法在它们之外没有作用域。为了使用外部声明的变量。使用global关键字,告诉服务器使用定义在更高范围内的变量。

    $varname = "value";
    function yourfunctionname() {
        //In order to use the variable declare you want to use the globally declared 
        global $varname;
        //now $varname will have "value` as its value
    
       //continue with your logic
    }
    

    【讨论】:

    • 非常感谢您的快速回答,很抱歉没有将其选为公认的答案!
    • @AKLP,没有必要为每个答案感到抱歉,你没有接受。很酷.... :)
    • 好吧,你自己花时间来帮助我吧:)
    【解决方案3】:

    $xml是全局变量,需要使用global关键字。

    function products($search = FALSE, $query= '', $page = 1, $results = 5){
        global $xml;
        //...
    }
    

    【讨论】:

    • 非常感谢您的快速回答,很抱歉没有将其选为公认的答案!
    猜你喜欢
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    相关资源
    最近更新 更多