$ this-> function();?的奇怪OOP行为

时间:2011-07-18 23:12:42

标签: php oop

我有这个代码(两个类)

class url
{
        private $profile_id;
        private $short;
        public $notice;
        private $forbidden;
        function url() {
                $this->forbidden = array('index.php', 'index.html', 'styles.css', 'style.css');
                if ($_POST['profile_id']){
//                      global $db;
                        $exists = db::fetch_one(db::query("SELECT count(1) FROM ".TABLE." WHERE profile_id = ".intval($_POST['profile_id']).";"));
                        $exists_username = db::fetch_one(db::query("SELECT count(1) FROM ".TABLE." WHERE url_short = '".db::mres($_POST['url_short'])."'"));
                }
        }
}

class db
{
        function db(){
                mysql_connect("localhost", "root", "h1gh§c1a0");
                mysql_select_db("gplus") or die(mysql_error());
                mysql_set_charset("utf8") or die(mysql_error());
        }

        function query($query){
//              print_r( $this);
                $result = mysql_query(self::protect($query)) or _log("Query failed: ".$query);
                //$this isn't working
                //$result = mysql_query($this->protect($query)) or _log("Query failed: ".$query);
                 return $result;

        }

        function fetch($result){
                $result = mysql_fetch_assoc($result);
                return $result;
        }

        function fetch_one($result){
                $result = mysql_fetch_row($result);
                return $result['0'];
        }


        function mres($text) {
                return mysql_real_escape_string($result);
        }

        function protect($text) {

                if (preg_match("/UNION/i", $text)) {
                        _log("Hack attempt: ".$text);
                        die();
                }
//              die($text);
                return $text;
        }
}

$db = new db();
$url = new url();

我的问题是,这一行

$result = mysql_query(self::protect($query)) or _log("Query failed: ".$query);

有效,但当我用self::更改$this->时,它会抛出错误

Fatal error: Call to undefined method url::protect() in /data/my/db.php on line 71

怎么可能?我认为$this->function();调用当前类中的方法。我做错了什么?

2 个答案:

答案 0 :(得分:2)

url构造函数中,您静态调用db::query,因此protect()也将被静态调用,因此$this将无法使用。< / p>

您可以将其全部保持为静态,也可以将db的实例注入url

$db = new db();
$url = new url($db);

答案 1 :(得分:1)

使用db::query()时,您将以静态方式访问db(您正在调用类方法,而不是实例方法)。因此,没有什么可以通过$ this访问,因为$ this返回指向类实例的指针,而self是对类本身的引用。

如果您使用$db->query()$this->protect()也可以使用。