使用函数

时间:2016-02-12 05:33:13

标签: php wordpress function variables

我正在开发一个Wordpress插件,并尝试使用以下函数返回一个名为$user_country的变量,该变量可以在同一文件的其他函数中访问。当我将它嵌套在另一个函数中时,代码可以工作,但是当我将它作为自己的函数时,我无法从其他函数访问变量$user_country

(我仍然是PHP /编码的新手并且正在努力学习,如果我犯了一个明显的新手错误就不会感到惊讶。)

function get_user_country() {
    if (!class_exists('GeoIP')) {
    include_once("geoip.inc");
    }

    if (empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
        $ip_address = $_SERVER["REMOTE_ADDR"];
    } else {
        $ip_address = $_SERVER["HTTP_X_FORWARDED_FOR"];
    }

    if (!filter_var($ip_address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) === FALSE) {     
        $gi = \LSMIGeoIP\geoip_open(WP_PLUGIN_DIR . "/location-specific-menu-items/GeoIP.dat", GEOIP_STANDARD);
        $user_country = \LSMIGeoIP\geoip_country_code_by_addr($gi, $ip_address);
        \LSMIGeoIP\geoip_close($gi);
    } elseif (!filter_var($ip_address, FILTER_VALIDATE_IP,FILTER_FLAG_IPV6) === FALSE) {
        $gi = \LSMIGeoIP\geoip_open(WP_PLUGIN_DIR . "/location-specific-menu-items/V6GeoIP.dat", GEOIP_STANDARD);
        $user_country = \LSMIGeoIP\geoip_country_code_by_addr($gi, $ip_address);
        \LSMIGeoIP\geoip_close($gi);
    } else {
        $user_country = "Can't locate IP: " . $ip_address;              
    }
    return $user_country;
}

2 个答案:

答案 0 :(得分:1)

您可能想要使用的是函数内部的类,如:

$timeout

答案 1 :(得分:1)

忘记糟糕的设计和糟糕的代码(尽量避免将任意函数耦合到某个全局变量。再说一遍,你使用Wordpress你已经深陷糟糕的坏代码中),至少有三种方法可以实现你的目标想。

  1. 使用global
  2. $global = 88;
    function foo() {
      global $global;
      $global = 527;
    }
    print $global; // prints 88;
    foo();
    print $global; // prints 527;
    
    1. 通过reference
    2. function foo(&$myRef) {
       $myRef = 527;
      }
      $x = 88;
      foo($x); // now $x has the value 527. But you still need to pass it to the next function.
      
      1. Classesglobal命名空间有点像全局匿名类,其中包含所有内容。但最好定义包含变量的类和共享变量的函数:
      2. class MySetOfArbitraryStaitcFunctions {
          private static $myVar;
          public static function foo() {
            $myVar = 527;
          }
          public static function printMyVar() {
            print self::$myVar();
          }
        

        当然,您可以将var存储在某些第三方全局可访问存储(如会话或数据库)中。但基本上你通过共享变量存储的东西来做共享全局变量的事情。