重用PHP函数来减少代码重复

时间:2012-01-13 16:24:38

标签: php rss

我正从伦敦和纽约的雅虎天气RSS源中提取天气数据。我正在尝试通过重用包含用于提取天气数据的函数的PHP文件来减少代码重复。

以下是我正在调用的函数 - get_current_weather_data()。此功能适用于get_city()get_temperature()功能等各种其他功能。

<?php

function get_current_weather_data() {

// Get XML data from source

include_once 'index.php';  
$feed = file_get_contents(if (isset($sourceFeed)) { echo $sourceFeed; });

// Check to ensure the feed exists
if (!$feed) {
    die('Weather not found! Check feed URL');
}
$xml = new SimpleXmlElement($feed);

$weather = get_city($xml);
$weather = get_temperature($xml);
$weather = get_conditions($xml);
$weather = get_icon($xml);

return $weather;
}

在我的index.php中,我将RSS Feed的网址设置为名为$sourceFeed的变量。

<?php

$tabTitle = ' | Home';
$pageIntroductionHeading = 'Welcome to our site';
$pageIntroductionContent = 'Twinz is a website which has been created to bring towns together! 
            Our goal is to bring communities around the world together, by providing 
            information about your home town and its twin town around the world. Our 
            site provides weather, news and background information for London and 
            one of its twin cities New York.'; 
$column1Heading = 'Current Weather for New York'; 
$column2Heading = 'Current Weather for London'; 
$column3Heading = 'Current Weather for Paris'; 

$sourceFeed = "http://weather.yahooapis.com/forecastrss?p=USNY0996&u=f"; 

include_once 'header.php';
include_once 'navigationMenu.php';
include_once 'threeColumnContainer.php';
include_once 'footer.php';

?>

我尝试使用以下方式调用get_current_weather_data()函数中的Feed

(if (isset($sourceFeed)) { echo $sourceFeed; }).  

但是,我收到以下错误

"Warning: file_get_contents() [function.file-get-contents]: Filename cannot be empty in C:\xampp\htdocs\Twinz2\nyWeather.php on line 10
Weather not found! Check feed URL".

如果我更换

(if (isset($sourceFeed)) { echo $sourceFeed; }) 

使用其工作的Feed的网址,但这将阻止我重复使用代码。我试图做不可能的事情还是我的语法不正确?

这种isset方法可以在其他地方使用,例如$tabTitle和。{ {feed}需要$pageIntroductionHeading个变量。

提前致谢。

6 个答案:

答案 0 :(得分:2)

您正在尝试访问函数内的全局变量$sourceFeed。将其作为参数传递给函数:

// Pass $sourceFeed as a function parameter:
function get_current_weather_data($sourceFeed) {

  // Get XML data from source

  include_once 'index.php';  
  $feed = file_get_contents($sourceFeed));

  // Check to ensure the feed exists
  if (!$feed) {
      die('Weather not found! Check feed URL');
  }
  $xml = new SimpleXmlElement($feed);

  $weather = get_city($xml);
  $weather = get_temperature($xml);
  $weather = get_conditions($xml);
  $weather = get_icon($xml);

  return $weather;
}

并将该函数调用为:

$sourceFeed = "http://weather.yahooapis.com/forecastrss?p=USNY0996&u=f"; 
$weather = get_current_weather_data($sourceFeed);

答案 1 :(得分:1)

尝试将$ sourceFeed全局化为:

function get_current_weather_data() {
    global $sourceFeed

OR

get_current_weather_data($sourceFeed)

答案 2 :(得分:1)

您的问题是可变范围问题。进入函数内部的变量是一个仅用于函数的新变量。一旦返回/完成功能,它将无法访问。所以,你需要让函数知道值是什么:

 function get_current_weather_data( $sourceFeed ) {  // this tells the function to 
 // read that variable when it starts.  You also need to pass it when you call the function.

 get_current_weather_data( $sourceFeed );

 // OR
 get_current_weather_data( 'http://myurl.com' );

答案 3 :(得分:1)

问题出在以下几行:

$feed = file_get_contents(if (isset($sourceFeed)) { echo $sourceFeed; });

必须是:

if(isset($sourceFeed)){ $feed = file_get_contents($sourceFeed); }

当您调用该函数时,您还必须将$sourceFeed作为函数参数传递,如下所示:

get_current_weather_data($sourceFeed);

答案 4 :(得分:0)

isset($sourceFeed)将始终返回false。您在本地范围内使用它,而在全局范围内定义它。请在http://tr2.php.net/manual/en/language.variables.scope.php上阅读有关变量范围的更多信息。

答案 5 :(得分:0)

我很确定你在那里所做的事情甚至都不会解析。它肯定不会在PHP 5.2中解析。

$feed = file_get_contents(if (isset($sourceFeed)) { echo $sourceFeed; });

这是无效的。你不能在函数调用中放置if语句,即使它确实有效,也不会影响调用函数的方式。

您可以使用三元表达式:

$feed = file_get_contents((isset($sourceFeed)) ? $sourceFeed : '');

...但即使这样也无法帮助您,因为您必须将文件名传递给file_get_contents(),否则您将收到错误。

你的方法是错误的,而不是包括index.php来定义你的变量,你应该将变量作为参数传递给函数。例如:

function get_current_weather_data($sourceFeed) {

  // Get XML data from source

  $feed = file_get_contents($sourceFeed);

  // Check to ensure the feed exists
  if (!$feed) {
      die('Weather not found! Check feed URL');
  }
  $xml = new SimpleXmlElement($feed);

  $weather = get_city($xml);
  $weather = get_temperature($xml);
  $weather = get_conditions($xml);
  $weather = get_icon($xml);

  return $weather;

}