Повторное использование функции PHP для уменьшения дублирования кода - PullRequest
1 голос
/ 13 января 2012

Я получаю данные о погоде из RSS-канала погоды Yahoo для Лондона и Нью-Йорка. Я пытаюсь уменьшить дублирование кода, повторно используя файл 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 я установил URL для канала RSS в качестве переменной с именем $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(), используя:

(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; }) 

с URL-адресом фида, который он работает, но это не позволит мне повторно использовать код. Я пытаюсь сделать невозможное или мой синтаксис просто неверен?

Этот метод isset отлично работает, когда используется в других местах, например, $tabTitle и $pageIntroductionHeading переменные просто нужны для RSS-канала.

Спасибо заранее.

Ответы [ 6 ]

2 голосов
/ 13 января 2012

Вы пытаетесь получить доступ к глобальной переменной $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 голос
/ 13 января 2012

Проблема в следующей строке:

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

должно быть:

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

И когда вы вызываете функцию, вы также должны передать $sourceFeed в качестве параметра функции, например:

get_current_weather_data($sourceFeed);
1 голос
/ 13 января 2012

Ваша проблема связана с переменной областью.Переменная, которая входит в функцию, является новой переменной, которая используется только для функции.Он будет недоступен, как только функция будет возвращена / завершена.Итак, вы должны сообщить функции, что это значение:

 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' );
1 голос
/ 13 января 2012

Попробуйте сделать глобальный $ sourceFeed следующим образом:

function get_current_weather_data() {
    global $sourceFeed

ИЛИ

get_current_weather_data($sourceFeed)
0 голосов
/ 13 января 2012

Я вполне уверен, что то, что вы там сделали, даже не будет разбираться.Это конечно не будет анализироваться в 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;

}
0 голосов
/ 13 января 2012

isset($sourceFeed) всегда будет возвращать false. вы используете его в локальной области, тогда как вы определяете его в глобальной области. пожалуйста, прочитайте больше о переменных областях на http://tr2.php.net/manual/en/language.variables.scope.php.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...