41

I am trying to call a function from another function. I get an error:

Fatal error: Call to undefined function getInitialInformation() 
in controller.php on line 24

controller.php file:

require_once("model/model.php"); 

function intake() {
    $info = getInitialInformation($id); //line 24
}

model/model.php

function getInitialInformation($id) {
    return $GLOBALS['em']->find('InitialInformation', $id);
}

Things already tried:

  1. Verified that the require_once works, and the file exists in the specified location.
  2. Verified that the function exists in the file.

I am not able to figure this out. Am I missing something here?

6
  • Are you using any sort of framework? Commented Jan 2, 2013 at 1:23
  • Are you sure the model file is being included? Is all error reprting turned on? Commented Jan 2, 2013 at 1:27
  • try calling a simpler function such as returning a number to triple check that your actually calling the file. Commented Jan 2, 2013 at 1:28
  • @WaleedKhan - No frameworks. But its legacy code, I am just maintaining. Commented Jan 2, 2013 at 1:39
  • Is that the whole code of intake()? If it is, you need to globalize the $id variable there to have access to it in that specific scope. Commented Jan 2, 2013 at 1:43

8 Answers 8

94

How to reproduce the error, and how to fix it:

  1. Put this code in a file called p.php:

    <?php
    class yoyo{
        function salt(){
        }
        function pepper(){
            salt();
        }
    }
    $y = new yoyo();
    $y->pepper();
    ?>
    
  2. Run it like this:

    php p.php
    
  3. We get error:

    PHP Fatal error:  Call to undefined function salt() in 
    /home/el/foo/p.php on line 6
    
  4. Solution: use $this->salt(); instead of salt();

    So do it like this instead:

    <?php
    class yoyo{
        function salt(){
        }
        function pepper(){
            $this->salt();
        }
    }
    $y = new yoyo();
    $y->pepper();
    
    ?>
    

If someone could post a link to why $this has to be used before PHP functions within classes, yeah, that would be great.

Sign up to request clarification or add additional context in comments.

7 Comments

I would like to know this too. How to avoid using $this?
$this-> refers to a function that belongs to the class and is declared within the class, same thing applies for variables declared inside the class. Inside the class it's called $this->function(), If public outside the class it's called $theclass->function()
Make sure you are not using $this.functionName() or self.functionName() or $self->functionName()..... or variations of. Bit rusty in PHP :-)
i was doing the mistake of not using $this->functionName(). What is understand is when you use function from same class, we need to use $this.
Was executing$this.some_function(); instead of $this->some_function();, thanks!
|
30

This was a developer mistake - a misplaced ending brace, which made the above function a nested function.

I see a lot of questions related to the undefined function error in SO. Let me note down this as an answer, in case someone else have the same issue with function scope.

Things I tried to troubleshoot first:

  1. Searched for the php file with the function definition in it. Verified that the file exists.
  2. Verified that the require (or include) statement for the above file exists in the page. Also, verified the absolute path in the require/include is correct.
  3. Verified that the filename is spelled correctly in the require statement.
  4. Echoed a word in the included file, to see if it has been properly included.
  5. Defined a separate function at the end of file, and called it. It worked too.

It was difficult to trace the braces, since the functions were very long - problem with legacy systems. Further steps to troubleshoot were this:

  1. I already defined a simple print function at the end of included file. I moved it to just above the "undefined function". That made it undefined too.
  2. Identified this as some scope issue.

  3. Used the Netbeans collapse (code fold) feature to check the function just above this one. So, the 1000 lines function above just collapsed along with this one, making this a nested function.

  4. Once the problem identified, cut-pasted the function to the end of file, which solved the issue.

4 Comments

I don't see a misplaced end brace... was it not included in the code you provided above?
It is not included in the code above, since it was 1000+ lines under.
ok, thanks. i had the same identical problem, but it turned out to be a completely different developer mistake, and in the mean time I wanted to make sure I wasn't missing a brace anywhere too, but not seeing the missing brace above was tripping me up.
Troubleshooting the same problem and TIL: in cli you can do php -l filename.php to check for syntax errors!
8

Many times the problem comes because php does not support short open tags in php.ini file, i.e:

<?
   phpinfo();
?>

You must use:

<?php
   phpinfo();
?>

Comments

5

Your function is probably in a different namespace than the one you're calling it from.

http://php.net/manual/en/language.namespaces.basics.php

1 Comment

Thanks. It was somewhat similar. Not namespace, but scope of function.
1

I happened that problem on a virtual server, when everything worked correctly on other hosting. After several modifications I realized that I include or require_one works on all calls except in a file. The problem of this file was the code < ?php ? > At the beginning and end of the text. It was a script that was only < ?, and in that version of apache that was running did not work

Comments

1

This is obviously not the case in this Q, but since I got here following the same error message I though I would add what was wrong with my code and maybe it will help some one else:

I was porting code from JS to PHP and ended up having a class with some public method. The code that was calling the class (being code that originated from JS) looked something like:

$myObject.method(...)

this is wrong because in PHP it should look like this:

$myObject->method(...)

and it also resulted with "PHP Call to undefined function".

change to use -> and the problem was solved.

Comments

0

Presently I am working on web services where my function is defined and it was throwing an error undefined function.I just added this in autoload.php in codeigniter

$autoload['helper'] = array('common','security','url');

common is the name of my controller.

1 Comment

I know that as a new user, you cannot comment for short ideas, but if you answer, please make your response a little more robust and describe what your solution actually does. See how to answer. As an aside, you can put four spaces in front of any line of text to display it like this for readability, or for in-line code, use `back ticks` to produce back ticks.
0

Disclaimer: Am not an expert on PHP. I had a similar issues while upgrading PHP version for apache2, tried all the suggested solutions but didn't help. Finally found that the php-fpm version enabled (had to do something like -sudo a2enmod php7.4) and the one present in /etc/apache2 php.ini PHP version were different. Once these were synchronized, the error went away.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.