<?php
$user = new User();
$user->username = "johnsmith";
$user->password = "555";
$user->first_name = "john";
$user->last_name = "smith";
$user->create();
?>
扩展DatabaseObject类的用户类。..
class User extends DatabaseObject {
protected static $table_name="users";
protected static $db_fields = array('id', 'username', 'password', 'first_name', 'last_name');
public $id;
public $username;
public $password;
public $first_name;
public $last_name;
}
带有后期静态绑定的DatabaseObject类。..
class DatabaseObject {
protected static function attributes() {
$attributes = array();
foreach(static::$db_fields as $field) {
if(property_exists(get_called_class(), $field)) {
$attributes[$field] = get_called_class()->$field;
}
}
return $attributes;
}
protected static function sanitized_attributes() {
global $database;
$clean_attributes = array();
foreach(self::attributes() as $key => $value) {
$clean_attributes[$key] = $database->escape_value($value);
}
return $clean_attributes;
}
public static function create() {
global $database;
$attributes = self::sanitized_attributes();
$sql = "INSERT INTO ".static::$table_name." (";
$sql .= join(",", array_keys($attributes));
$sql .=") VALUES ('";
$sql .= join("', '", array_values($attributes));
$sql .= "')";
if($database->query($sql)) {
static::$id = $database->insert_id();// get last id saved in database and puts it in the id arguement
return true;
} else {
return false;
}
}
如果希望继续使用该结构,应该将静态字段$db_fields设置为DatabaseObject。否则,将DatabaseObject的类型更改为abstract,为数据库fieldset设置一个空数组,并将其设置为Protected。作为DatabaseObject(User)实现的__construct函数的一部分,使用setfields->array(...)
来设置映射的字段。或者,您可以允许像$user->foo
这样的直接属性调用,并使用__get
&_set
魔法方法和预定义所有允许的字段,而不是使用映射数组。
下面是用于打印SQL的DatabaseObject类:
class DatabaseObject {
protected static function attributes() {
$attributes = array();
foreach(static::$db_fields as $field) {
if(property_exists(get_called_class(), $field)) {
$attributes[$field] = get_called_class()->$field;
}
}
return $attributes;
}
protected static function sanitized_attributes() {
$clean_attributes = array();
foreach(self::attributes() as $key => $value) {
$clean_attributes[$key] = $value;
}
return $clean_attributes;
}
public static function create() {
$attributes = self::sanitized_attributes();
$sql = "INSERT INTO ".static::$table_name." (";
$sql .= join(",", array_keys($attributes));
$sql .=") VALUES ('";
$sql .= join("', '", array_values($attributes));
$sql .= "')";
print $sql;
}
}
现在,如果我按照您的示例运行它,我会得到以下输出:
php > $user->create();
PHP Notice: Trying to get property of non-object in php shell code on line 6
PHP Notice: Trying to get property of non-object in php shell code on line 6
PHP Notice: Trying to get property of non-object in php shell code on line 6
PHP Notice: Trying to get property of non-object in php shell code on line 6
PHP Notice: Trying to get property of non-object in php shell code on line 6
INSERT INTO users (id,username,password,first_name,last_name) VALUES ('', '', '', '', '')
理想情况下,当您使用方法时,它们应该是非静态的,因此对于标准的OOP编程实践,A扩展B,$B是B,$b->foo()html" target="_blank">调用A::foo(),其中foo()是A的非静态方法。
在数据库访问中使用静态绑定有什么原因吗?
编辑--
本文向大家介绍PHP面向对象之后期静态绑定功能介绍,包括了PHP面向对象之后期静态绑定功能介绍的使用技巧和注意事项,需要的朋友参考一下 本文将对PHP后期静态绑定功能进行介绍,它主要用于解决在继承范围内引用静态调用的类。 首先来看下面这个例子: 很明显,结果不是我们预期的,这是因为self::取决于定义时所在的类,而不是运行中的类。为了解决这个问题,你可能会在继承类中重写status()方法,更好
问题内容: 我对动态绑定和静态绑定感到非常困惑。我已经读过,在编译时确定对象的类型称为静态绑定,而在运行时确定它的称为动态绑定。 下面的代码会发生什么: 静态绑定还是动态绑定? 这表明什么样的多态性? 问题答案: 您的示例是 动态绑定 ,因为在运行时确定类型是什么,并调用适当的方法。 现在假设您也具有以下两种方法: 即使您更改为 这将打印出来,因为对的调用使用 静态绑定 ,并且编译器仅知道其类型。
静态绑定还是动态绑定? 这显示了什么样的多态性?
我想在Java中得到一个等价的...所以类似于 编辑:我知道在大多数流行的语言中没有“标准的方法”来做到这一点。我在找黑客之类的。另外,这在C/C++或任何其他流行的OOP语言中可能吗? 这不是为了任何真正的设计上的任何东西。我只是好奇而已。
我们知道静态绑定发生在私有、静态、最终和重载的方法上,而动态绑定发生在被覆盖的方法上。但是如果我的方法只是公共的,它既不是静态的,也不是覆盖和重载的怎么办? 有人能给我解释一下print()的绑定会怎样,因为它既没有重载也没有被覆盖。
本文向大家介绍php5.3后静态绑定用法详解,包括了php5.3后静态绑定用法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php5.3后静态绑定用法。分享给大家供大家参考,具体如下: 手册原文: 自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。 准确说,后期静态绑定工作原理是存储了在上一个"非转发调用"(non-forward