【问题标题】:Define a variable before including function in PHP, and use variable在 PHP 中包含函数之前定义一个变量,并使用变量
【发布时间】:2017-02-20 17:56:38
【问题描述】:

我正在使用 php 为我们的内容管理软件制作菜单,但我们遇到了这个小问题。由于我们希望最终以块的形式调用所有内容,因此将某些页面项目分解为块并通过包含文件的函数加载它们。由于这很难解释,我将在下面发布一些示例代码。

这是文件 page.php(删除了不必要的 html 代码)。 这是用户所在的页面:

<?php
define("CURRENT_PAGE", "page.php");
include_once("data/main.inc.php");
?><html>
Content loads here.
<? desktopMenu(); ?>
</html>

好的,下面是 main.inc.php 中 desktopMenu() 的函数:

function desktopMenu() {
    // Query to get the top level navigation links with no parents
    $query = mysql_query("SELECT * FROM menu WHERE p_id = '0'");
    if(mysql_num_rows($query) > 0) {
        while($result = mysql_fetch_array($query)) {
            extract($result);
            if($isparent == "1") {
                // Just check if they have children items
                $sub_menu_query = mysql_query("SELECT * FROM menu WHERE p_id = '$id'");
                if(mysql_num_rows($sub_menu_query) > 0) {
                    // CODE TO SHOW THE MENU ITEM AND ITS SUBS
                }
            } else {
                // CODE TO SHOW REGULAR MENU ITEMS
                // WANT TO INSERT class='active' if the CURRENT_PAGE is this value..
                echo "<li><a href='#'>link</a></li>";
        }
    } else {
        echo "<li><a href='javascript:void(0);'>Error Loading Menu</a></li>";
    }
}

我想知道如何在包含的脚本上获取 CURRENT_PAGE,以便将class="active" 加载到正确的页面上。我已经在使用以下内容:

$config = include('config.inc.php');
$GLOBALS = $config;

在main.inc.php 的顶部,此菜单函数上方,这样我就可以设置全局变量并包含我的$config['database'] 变量以在函数中调用 SQL 数据库(否​​则不起作用)。

如何检查 current_page 变量以便在菜单中将其设置为活动状态?我尝试了一些不同的东西,但没有任何东西显示出我们期望的方式。谢谢大佬。

【问题讨论】:

  • 你将CURRENT_PAGE定义为一个常量,这意味着它是一个超级全局的,所以你可以在函数内部使用它。
  • CURRENT_PAGE 在我尝试在我的函数中使用它时不会返回任何内容,即使我在包含页面之前设置了它。这让我很困惑。

标签: php


【解决方案1】:

我找到了解决问题的方法,并想在这里分享。我首先将 page.php 上的调用设置为使用 desktopMenu(CURRENT_PAGE);,然后在 main.inc.php 上添加了这一行

$thispage = CURRENT_PAGE;
function desktopMenu($thispage) {
    //REST OF FUNCTION
}

我在每个菜单项上设置了一个名为 menu-group 的表变量,因此我可以为菜单项定义当前菜单组,并在您位于该页面或其子页面之一时突出显示相应的菜单项.

非常感谢大家的回答!

【讨论】:

    【解决方案2】:

    首先,我建议您在构建应用时查看 MVC 架构。我相信使用 GLOBALS 是不受欢迎的。

    回答您的问题: 由于您正在定义一个常量 define("CURRENT_PAGE", "page.php");那么这将在函数 desktopMenu() 的范围内全局可用 所以你可以使用类似的东西:

    $className = (isset(CURRENT_PAGE) && CURRENT_PAGE=='xxxxx')?'class="active"':'';
    echo "<li><a href='#' ".$className.">link</a></li>";
    

    xxxx 字符串很可能是从您的数据库输出的字段,作为与定义的常量匹配的页面名称。

    $className = (isset(CURRENT_PAGE) && CURRENT_PAGE==$result['page_name'])?'class="active"':'';
    

    这是基本形式,您很可能需要附加条件才能将“活动”菜单切换映射到不同页面。 我试图用一个例子来回答你的问题,尽管你使用的运行应用程序的结构不是推荐的开发方式。

    我会研究现代框架的结构方式(Laravel、Zend、Symphony...)并利用它们。 我还会尝试自动化页面映射(例如,查看 URL 并从与数据库中的菜单匹配的重写中提取页面)

    祝你好运

    【讨论】:

      【解决方案3】:

      有多种选择。包括静态函数、全局变量以及将变量或对象传递给函数。
      各种原因的共识是把变量传给函数

      $myVar = new Object\Or\Data();
      
      function myFunction($myVar) {
          //do stuff with $myVar
      }
      
      //then call the function
      myFunction($myVar);
      

      stackOverflow 上有很多关于这个问题的答案,所以请进行更深入的搜索。 Here is an example

      【讨论】:

      • 我认为你错过了答案的主要部分,即myFunction($myVar);
      • 没问题。我想这就是你的意思
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      相关资源
      最近更新 更多