Php函数返回错误

My php function is returning an Error.

these two function from the same class

error Fatal error: Using $this when not in object context in D:\xampp\htdocs\admin\functions.php(98) : runtime-created function on line 1

public function noFollowLinks($str) {
    // replaces every link with the version provided by fixLink()
    return preg_replace_callback("#(<a.*?>)#i", create_function('$matches', 'return $this->fixLink($matches[1]);'), $str);
}

public function fixLink($input) {
    $whitelist = $GLOBALS['whitelist'];
    // if the link in $input already contains ref=”nofollow”, return it as it is
    if (preg_match('#rel\s*?=\s*?[\'"]?.*?nofollow.*?[\'"]?#i', $input)) {
        return $input;
    }
    // extract the URL from $input
    preg_match('#href\s*?=\s*?[\'"]?([^\'"]*)[\'"]?#i', $input, $captures);
    // $href will contain the extracted URL, such as http://seophp.example.com
    $href = $captures[1];
    // if URL doesn’t contain http://, assume it’s a local link
    if (!preg_match('#^\s*http://#', $href)) {
        return $input;
    }
    // extract the host name of the URL, such as seophp.example.com
    $parsed = parse_url($href);
    $host = $parsed['host'];
    // if the URL is in the whitelist, send $input back as it is
    if (in_array($host, $whitelist)) {
        return $input;
    }
    // assuming the URL already has a rel attribute, change its value to nofollow
    $x = preg_replace('#(rel\s*=\s*([\'"]?))((?(3)[^\'"]*|[^\'"]*))([\'"]?)#i', '\\1\\3,nofollow\\4', $input);
    // if the string has been modified, it means it already had a rel attribute,
    // whose value has been changed to nofollow, so we return the new version
    if ($x != $input) {
        return $x;
    }
    // if the link in the input string doesn’t have ref attribute, we add it
    else {
        return preg_replace('#<a#i', '<a rel="nofollow"', $input);
    }
}

As Andrey said, you cannot use $this in the function created by create_function. My soultion to this, would be to replace your noFollowLinks with this:

public function noFollowLinks($str) {
    // replaces every link with the version provided by fixLink()
    return preg_replace_callback("#(<a.*?>)#i", array($this, 'fixLinkCallback'), $str);
}

private function fixLinkCallback($matches) {
    return $this->fixLink($matches[1]);
}

You can't use $this in closure, because it is not a object.


You have to do something like this:

<?php

       class A {

              public $name ;

              public function doSomething ( Closure $closure ) {
                     return call_user_func_array ( $closure , array ( $this ) ) ;
              }

       }

       $A = new A ( ) ;
       $A->name = 'test' ;
       $A->doSomething(function($object){
              print_r ( $object ) ;
       });

When using a closure, it's acting as a separate function outside of a class. It's not attached to the class like other methods (functions inside the class) are, so using $this will cause that error, just as if you used $this outside of a class