PHP如何在另一个类方法中使用类方法?

时间:2013-03-20 15:33:13

标签: php

security.php     

class Security {

    public function sanitize($data) {
        return mysql_real_escape_string($data);
    }
}
?>

users.php

<?php


class User {

    private $db;

    public function __construct() {
        $this->db = new Connection();
        $this->db = $this->db->dbConnect();
    }

    public function userExists($username) {
        $username = sanitize($username);
        $st = $this->db->prepare("SELECT * FROM `users` WHERE `username`=? ");
        $st->bindParam(1, $username);
        $st->execute();

        if ($st->rowCount() == 1) {
                echo "User exists";
            } else {
                echo 'Incorrect username or password lad';
            }
    }
}

?>

在我的用户存在方法我想使用sanitize方法,但我不确定在oop中执行此操作的正确方法。 这两个类都在不同的文件上。任何帮助表示感谢。

3 个答案:

答案 0 :(得分:3)

我最好的建议是将Security中的sanitize方法设为静态函数。这样您就可以在不必实例化对象的情况下访问该方法。

示例:

<?php
class Security {
  public static function sanitize($data) {
    return mysql_real_escape_string($data);
  }
}

在您的用户班中:

public function userExists($username) {
    $username = Security::sanitize($username);

以下是一个完整的工作示例:

security.php

<?php
class Security {
  public static function sanitize($data) {
    return mysql_real_escape_string($data);
  }
}

users.php

<?php
class User {
  private $db;

  public function __construct() {
    $this->db = new Connection();
    $this->db = $this->db->dbConnect();
  }

  public function userExists($username) {
    $username = Security::sanitize($username);
    $st = $this->db->prepare("SELECT * FROM `users` WHERE `username`=? ");
    $st->bindParam(1, $username);
    $st->execute();

    if($st->rowCount() == 1) {
      return True;
    } else {
      return False;
    }
  }
}

test.php (见行动!)

<?php
require_once 'security.php';
require_once 'user.php';

$user = new User();
$exists = $user->userExists('my-username');
if($exists) {
  print 'User exists';
} else {
  print 'Incorrect username or password lad';
}

答案 1 :(得分:1)

好吧,包含文件,正确实例化对象并调用其方法。

<?php
require_once 'security.php';
class User {

private $db;

public function __construct() {
    $this->db = new Connection();
    $this->db = $this->db->dbConnect();
}

public function userExists($username) {
    $sec = new Security();
    $username = $sec->sanitize($username);
    $st = $this->db->prepare("SELECT * FROM `users` WHERE `username`=? ");
    $st->bindParam(1, $username);
    $st->execute();

    if ($st->rowCount() == 1) {
            echo "User exists";
        } else {
            echo 'Incorrect username or password lad';
        }
   }
}

答案 2 :(得分:1)

这可能有点长篇大论,但它会对你最终想要学习的一些主题有所了解。

当您使用预准备语句时,您也不需要逃避任何事情。但是无论如何我都会回答你的问题。

有很多方法可以做到这一点。

依赖注入

您可以使用Connection在构造函数中实例化一个Security实例。但这是错误的方式,因为它使你的代码依赖于Security类,就像你的类现在依赖于Connection类

要解决此问题,请使用dependency injection

public function __construct( DBInterface $db ) {
    $this->db = $db;
}

像这样使用

$connection = new Connection();
$db = $connection->dbConnect();
$user = new User( $db );

现在您的代码仅依赖于DBInterface interface。您现在可以创建任意数量的实现该接口的类,并将它们传递给用户类。

您可以在Security中创建该方法,但这也会增加对Security类的依赖性。

您也可以在构造函数中传递安全对象,但这很快就会变得难看。看看dependency injection containers


将方法添加到连接类

由于您创建了自己的Connection类,因此可以将escape方法添加到连接类并使用$this->db->sanitize()

进行调用
$username = $this->db->sanitize($username);

php 5.4

中的特征
Trait Security {
    public function sanitize($data) {
        return mysql_real_escape_string($data);
    }
}

Class User {
    use Security;
...
}

然后使用安全特征的方法,就像它们在User类中一样。


我故意不提及创建基类并扩展它,因为在这种情况下使用User和Security类它没有意义。