当前位置: 首页 > 知识库问答 >
问题:

PHP后期静态绑定问题

拓拔嘉运
2023-03-14
<?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; 
  }

}

共有1个答案

秦晋
2023-03-14

如果希望继续使用该结构,应该将静态字段$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的非静态方法。

在数据库访问中使用静态绑定有什么原因吗?

编辑--

    null
 类似资料:
  • 本文向大家介绍PHP面向对象之后期静态绑定功能介绍,包括了PHP面向对象之后期静态绑定功能介绍的使用技巧和注意事项,需要的朋友参考一下 本文将对PHP后期静态绑定功能进行介绍,它主要用于解决在继承范围内引用静态调用的类。 首先来看下面这个例子: 很明显,结果不是我们预期的,这是因为self::取决于定义时所在的类,而不是运行中的类。为了解决这个问题,你可能会在继承类中重写status()方法,更好

  • 问题内容: 我对动态绑定和静态绑定感到非常困惑。我已经读过,在编译时确定对象的类型称为静态绑定,而在运行时确定它的称为动态绑定。 下面的代码会发生什么: 静态绑定还是动态绑定? 这表明什么样的多态性? 问题答案: 您的示例是 动态绑定 ,因为在运行时确定类型是什么,并调用适当的方法。 现在假设您也具有以下两种方法: 即使您更改为 这将打印出来,因为对的调用使用 静态绑定 ,并且编译器仅知道其类型。

  • 静态绑定还是动态绑定? 这显示了什么样的多态性?

  • 我想在Java中得到一个等价的...所以类似于 编辑:我知道在大多数流行的语言中没有“标准的方法”来做到这一点。我在找黑客之类的。另外,这在C/C++或任何其他流行的OOP语言中可能吗? 这不是为了任何真正的设计上的任何东西。我只是好奇而已。

  • 我们知道静态绑定发生在私有、静态、最终和重载的方法上,而动态绑定发生在被覆盖的方法上。但是如果我的方法只是公共的,它既不是静态的,也不是覆盖和重载的怎么办? 有人能给我解释一下print()的绑定会怎样,因为它既没有重载也没有被覆盖。

  • 本文向大家介绍php5.3后静态绑定用法详解,包括了php5.3后静态绑定用法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php5.3后静态绑定用法。分享给大家供大家参考,具体如下: 手册原文: 自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。 准确说,后期静态绑定工作原理是存储了在上一个"非转发调用"(non-forward