Skip to main content

Reusing PHP function to reduce code duplication



I am pulling in weather data from a Yahoo weather RSS feed for both London and New York. I'm trying to reduce code duplication by reusing a PHP file which contains functions for pulling in the weather data.





Below is the function I am calling - get_current_weather_data() . This function goes off to various other functions such at the get_city() and get_temperature() functions.







<?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;

}







In my index.php I set the URL for the RSS feed as the variable called $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';



?>







I attempt to call the feed in my get_current_weather_data() function using:







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







However, I receive the following error







"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 I replace







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







with the URL for the feed it works but this will stop me from reusing the code. Am I trying to do the impossible or is my syntax just incorrect?





This isset method works fine where used elsewhere like for example the $tabTitle and $pageIntroductionHeading variables just need for the RSS feed.





Thanks in advance.


Comments

  1. You're attempting to access a global variable $sourceFeed inside your function. Pass it as a parameter to the function instead:

    // 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;
    }


    And call the function as:

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

    ReplyDelete
  2. Try to make $sourceFeed global like this:

    function get_current_weather_data() {
    global $sourceFeed


    OR

    get_current_weather_data($sourceFeed)

    ReplyDelete
  3. Your issue is a variable scope issue. The variable that goes inside of the function is a new variable that is used only for the function. It will inaccessible once the function is returned/completed. So, you need to let the function know what the value is:

    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' );

    ReplyDelete
  4. The problem is in the following line:

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


    it has to be:

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


    And when you call the function, you also have to pass $sourceFeed as function parameter, like that:

    get_current_weather_data($sourceFeed);

    ReplyDelete
  5. isset($sourceFeed) will always return false. you are using it in a local scope whereas you define it in the global scope. please read more on variable scopes at http://tr2.php.net/manual/en/language.variables.scope.php.

    ReplyDelete
  6. I am fairly sure that what you have done there will not even parse. It certainly won't parse in PHP 5.2.

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


    This is not valid. You cannot place an if statement inside a call to a function, and even if that did work, it would not affect the way the function is called.

    You can use a ternary expression:

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


    ...but even this will not help you here, since you have to pass a filename to file_get_contents() or you will get the error you see.

    Your approach to this is all wrong, rather than including index.php to define your variable, you should pass the variable to the function as an argument. For example:

    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;

    }

    ReplyDelete

Post a Comment

Popular posts from this blog

[韓日関係] 首相含む大幅な内閣改造の可能性…早ければ来月10日ごろ=韓国

div not scrolling properly with slimScroll plugin

I am using the slimScroll plugin for jQuery by Piotr Rochala Which is a great plugin for nice scrollbars on most browsers but I am stuck because I am using it for a chat box and whenever the user appends new text to the boxit does scroll using the .scrollTop() method however the plugin's scrollbar doesnt scroll with it and when the user wants to look though the chat history it will start scrolling from near the top. I have made a quick demo of my situation http://jsfiddle.net/DY9CT/2/ Does anyone know how to solve this problem?

Why does this javascript based printing cause Safari to refresh the page?

The page I am working on has a javascript function executed to print parts of the page. For some reason, printing in Safari, causes the window to somehow update. I say somehow, because it does not really refresh as in reload the page, but rather it starts the "rendering" of the page from start, i.e. scroll to top, flash animations start from 0, and so forth. The effect is reproduced by this fiddle: http://jsfiddle.net/fYmnB/ Clicking the print button and finishing or cancelling a print in Safari causes the screen to "go white" for a sec, which in my real website manifests itself as something "like" a reload. While running print button with, let's say, Firefox, just opens and closes the print dialogue without affecting the fiddle page in any way. Is there something with my way of calling the browsers print method that causes this, or how can it be explained - and preferably, avoided? P.S.: On my real site the same occurs with Chrome. In the ex