0

I try to use $this in a nested function in my class.

I call the method with:

$check_membership = $this->setAuthorisation($posted_username, $ldap_connection);

the method looks like:

private function setAuthorisation($posted_username, $ldap_connection)
{
    // split the posted username for filtering common name
    $temp_var = explode('\\', $posted_username);
    $cn_name = end($temp_var);

    // filter parameter for ldap_search
    $filter = "objectClass=*";

    // search attribute to get only member
    $attr = array("member");

    // possible membership status:
    // group_membership: "null": No access to enter the page.
    // group_membership:    "1": Access to the page, but no admin rights.
    // group_membership:    "2": Access to the page with admin rights.

    /**
     * perform the setMembershipUser for authorisation the "user" group
     */
    function setMembershipUser($ldap_connection, $cn_name, $filter, $attr)
    {
        // search for user in the authorized ad group "user"
        $user_result = ldap_search($ldap_connection, GROUP_USER.",".BASE_DS, $filter, $attr);

        // reads multiple entries from the given result
        $user_entries = ldap_get_entries($ldap_connection, $user_result);

        // check if cn_name is in $user_entries
        if (preg_grep("/CN=".$cn_name."/i", $user_entries[0]["member"]))
        {
            $this->group_membership = 1;
        } 
        else 
        {
            $this->group_membership = null;
        }
    }
    setMembershipUser($ldap_connection, $cn_name, $filter, $attr);
    return $this->group_membership;
}

in the function setMembershipUser I got the Error "Fatal error: Using $this when not in object context in..."

Can I use $this in nested functions? The outer function is in my class.

karthikr
  • 97,368
  • 26
  • 197
  • 188
mnlfischer
  • 397
  • 4
  • 12
  • 26
  • 2
    Why would you nest the functions like that? Just create `setMembershipUser()` as a "normal" function that's `private`. – nickb Sep 23 '13 at 14:58
  • Haven't seen such nesting in a class for a long time and they are called `methods` in classes – Hanky Panky Sep 23 '13 at 14:59
  • Thought it looks like more structured – mnlfischer Sep 23 '13 at 14:59
  • http://stackoverflow.com/questions/415969/what-are-php-nested-functions-for – GordonM Sep 23 '13 at 15:01
  • @GordonM, Yes there are (some, few) reasons for nested functions, but what is the point of them in this case? – barryhunter Sep 23 '13 at 15:04
  • @barryhunter Read the top answer: The ability to define a function within a function is pretty much a side-effect of how the PHP parser works rather than a deliberate design choice. They're best avoided altogether. – GordonM Sep 23 '13 at 16:05
  • that's kind my point too! I thought you linking there for a different reason, ie as a reply to nickb. if you just replying to ziggyyy on why nested functions are bad, then thats fine! – barryhunter Sep 23 '13 at 16:22

1 Answers1

1

Your nested function is just that... a function. It's not a method of the parent class, even though it exists only within that method. You could pass in the outer $this as a parameter, e.g.

class foo {
   function bar() {
       function baz($qux) {
          ...
       }
       baz($this);
   }
}

But... You shouldn't be nesting functions like that anyways. Why not just promote your nested function to a full-blown "regular" function, meaning it would be a method of your class, and then $this would be available as expected.

As another note, you could not use $global to make $this visible inside the method, because global only looks at the real global scope, it doesn't look in "parent" scopes at all. e.g.

$x = 42;
class foo {
   function bar() {
       $x = 13;
       function baz() {
            $x = 69;
            echo $x; // outputs 69
            global $x;
            echo $x; // outputs 42
       }
   }
}

There is no way for the baz() function to get at $x = 13, because the only scopes available anywhere in PHP are the "local" scope, which is the 69 is defined, and the global scope, where $x is 42.

sybear
  • 7,837
  • 1
  • 22
  • 38
Marc B
  • 356,200
  • 43
  • 426
  • 500