Php 这是OOP或者类似于OOP
长时间的阅读和测试,但我想知道。这是不是正确的PHP OOP代码Php 这是OOP或者类似于OOP,php,oop,Php,Oop,长时间的阅读和测试,但我想知道。这是不是正确的PHP OOP代码 Class User { function Add($Name, $Password){ $sql_str = "INSERT INTO User SET Name = '$Name', Password = '$Password'"; $sql->do_sql($sql_str); } function Del($UserID) { $sql_str = "DELETE FROM U
Class User {
function Add($Name, $Password){
$sql_str = "INSERT INTO User SET Name = '$Name', Password = '$Password'";
$sql->do_sql($sql_str);
}
function Del($UserID) {
$sql_str = "DELETE FROM User WHERE UserID = '$UserID'";
$sql->do_sql($sql_str);
}
function Show ($Limit)
if ($limit > 0){
$sql_str = "SELECT * FROM User ORDER BY Name LIMIT $Limit";
}else{
$sql_str = "SELECT * FROM User ORDER BY Name";
}
$result = $sql->do_sql($sql_str);
for ($i = 0; $i < COUNT($result); $i++){
$data[$i]['UserID'] = ....
$data[$i]['Name'] = ....
}
return $Data
}
}
$MyUser = new User;
类用户{
函数添加($Name,$Password){
$sql_str=“插入到用户集名称='$Name',密码='$Password'”;
$sql->do\u sql($sql\u str);
}
函数Del($UserID){
$sql_str=“从用户中删除,其中UserID='$UserID';
$sql->do\u sql($sql\u str);
}
功能显示($Limit)
如果($limit>0){
$sql_str=“按名称从用户订单中选择*限制$LIMIT”;
}否则{
$sql_str=“按名称从用户订单中选择*”;
}
$result=$sql->do\u sql($sql\u str);
对于($i=0;$i
现在我可以从userControl.php文件控制操作。如果我想做些什么,我可以将操作发送到user类的实例:$MyUser->Add($Name,$Password)代码>
这种方法更像分组函数而不是OOP,还是使用setter和getter更好
如果这个例子不是OOP,那么我做错了什么,需要如何用OOP的方式来做这个例子
Tnx从技术上讲是这样的,但是您要么缺少很多代码,要么您的方法不起作用。您似乎没有在任何地方定义$sql。由于oop的美妙之处在于消除重复代码,并且您在所有方法中都使用$sql,因此很高兴看到您是如何处理的。如果没有完整、有效的代码,就很难提供建议
这里有一个简单的例子来说明我的意思。由于您没有使用PHP5的任何oop功能,我将继续使用PHP4:
class User
{
var $sql;
function User()
{
$this->sql = new DatabaseConnection();
}
function add($data)
{
$query = '...query here...';
$this->sql->query($query);
}
}
如果您想查看一些可靠的企业级代码示例,我强烈建议您查看中的一些组件 你这样做是不对的。您真正想要做的是拥有一个表示单个用户的类用户,其方法反映了这一点
来自维基百科:
在面向对象编程中,一种
方法是一个
专门与某个
类(在这种情况下称为
类方法或静态方法)或
使用对象(在这种情况下,它是
实例方法)
用户对象至少应具有实例方法,使其能够:
- 从数据库加载
- 保存到数据库
以及一种静态方法,用于:
-创建一个用户并返回一个用户对象
它还应该有一个构造函数方法(PHP5中的__construct(args)或PHP4中的User(args))在创建用户时调用。这可能会接受id、用户名或其他标识,以便加载正确的用户
为了简单起见,而不仅仅是为您做任何事情,请想象一个用户对象只包含一个id和一个名称。下面是该类的外观:
假设PHP5:
class User{
private $id;
public $name;
public function __construct($id){
$this->load($id);
}
public function load($id){
// Do a query to load a user and initialize $id and $name.
}
public function save(){
// Do a query saving $this->id and $this->name to the database.
}
public static function create($name){
// Do a query to create a user with name $name.
}
}
您可以使用newuser($id)
加载给定id的用户,或创建一个给定的user::create($name)
冒着被比喻成十字架的风险,我不会在PHP中使用setter和getter代码>看起来很奇怪。试着这样做:
class UserManager {
public function add(User $user) {
$sql->do_sql("INSERT INTO users (id, name) VALUES (".$user->getId().", ".$user->getName().")");
}
public function delete(User $user) {
$sql->do_sql("DELETE FROM users WHERE id = ".$user->getId()." LIMIT 1");
}
public function show(User $user) {
return $sql->do_sql("SELECT * FROM users WHERE id = ".$user->getId());
}
}
及
可能适合的设计模式是。Thanx!我知道一些关于OOP的事情是不正确的,我的想法,我需要动摇。为什么我会这样做。首先我使用模板引擎。在用户发布数据之后,然后是此数据发布操作文件。下面是actionUser.php:
$op = '';
IF (ISSET($_REQUEST['op'])){
$op = ADDSLASHES($_REQUEST['op']);
}
if ($op == 'AddUser'){
$Name = ADDSLASHES($_REQUEST['Name'])
$Password = ADDSLASHES($_REQUEST['Password'])
$MyUser->Add($Name, $Password)
}
然后将操作发送给类用户
用户类有少量更多的函数
class User{
private $SQL;
public function __construct(){
$this->SQL = SQL::getInstance();
}
public Function AddUser ($Name, $Password) {
$sql_str ="INSERT INTO USER SET Name = '$Name', Password='$Password'";
$this->SQL->do_sql($sql_str);
}
public Function DelUser($UserID){
$sql_str = "DELETE FROM User WHERE UserID = '$UserID'";
$sql->do_sql($sql_str);
}
public Function Login($Login, $Password){
$sql_str = "SELECT * FROM User WHERE Login = '$Login' AND Password = '$Password' ";
LIST($sql_result, $sql_count) = $this->SQL->do_sql($sql_str);
if ($sql_count == 1){
$_SESSION["UserID"] = $this->SQL->result_strip($sql_result, 0, "AdminUserID");
$_SESSION["Login"] = $this->SQL->result_strip($sql_result, 0, "Login");
$sql_str = "UPDATE User SET LastLogin = NOW()";
$this->SQL->do_sql($sql_str);
}
}
public Function Logout(){
$_SESSION = array();
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-42000, '/');
}
session_destroy();
}
}
我认为不值得投反对票。这是一个精心设计的问题,并显示了一些代码。我认为它值+1,即使它不“漂亮”或“正确”。我认为如果你调用类UserAccount,你就可以去了。我是那种认为getter和setter方法很臭的疯子之一,但是YMMV。我甚至不得不承认有时我自己也会使用它们,但至少我感觉很糟糕在我开始之前。。。。。一般来说,我不会在PHP中使用setter和getter?或者仅仅针对这个特定的例子?:)
class User{
private $SQL;
public function __construct(){
$this->SQL = SQL::getInstance();
}
public Function AddUser ($Name, $Password) {
$sql_str ="INSERT INTO USER SET Name = '$Name', Password='$Password'";
$this->SQL->do_sql($sql_str);
}
public Function DelUser($UserID){
$sql_str = "DELETE FROM User WHERE UserID = '$UserID'";
$sql->do_sql($sql_str);
}
public Function Login($Login, $Password){
$sql_str = "SELECT * FROM User WHERE Login = '$Login' AND Password = '$Password' ";
LIST($sql_result, $sql_count) = $this->SQL->do_sql($sql_str);
if ($sql_count == 1){
$_SESSION["UserID"] = $this->SQL->result_strip($sql_result, 0, "AdminUserID");
$_SESSION["Login"] = $this->SQL->result_strip($sql_result, 0, "Login");
$sql_str = "UPDATE User SET LastLogin = NOW()";
$this->SQL->do_sql($sql_str);
}
}
public Function Logout(){
$_SESSION = array();
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-42000, '/');
}
session_destroy();
}
}