我正在学习PHP并尝试在教程之外创建一些代码我一直在观察,以便更好地理解它,我似乎无法弄清楚我要去哪里错误的代码如下。我有很多其他功能正常工作,只是没有这个。谁能指出我正确的方向?感谢。
我得到的结果是Catchable致命错误:类的对象User无法在第20行转换为字符串,即echo $user . "<br /><br />";
这是我的index.php
<?
$users = User::db_fields();
foreach($users as $user) {
echo $user . "<br /><br />";
}
?>
这是我在user.php中的用户类
<?php
class User extends OtherStuff {
public static function db_fields() {
global $db;
return static::find_by_sql("SHOW COLUMNS FROM my_table");
}
}
<?
以下是other_stuff.php中的一些OtherStuff类
class OtherStuff {
public static function find_by_sql($sql="") {
global $db;
$result_set = $db->query($sql);
$object_array = array();
while($row = $db->fetch_array($result_set)) {
$object_array[] = static::instantiate($row);
}
return $object_array;
}
public static function instantiate($record) {
$class_name = get_called_class();
$object = new $class_name;
foreach($record as $attribute => $value){
if($object->has_attribute($attribute)) {
$object->$attribute = $value;
}
}
return $object;
}
}
?>
答案 0 :(得分:0)
你傻了:
echo $users . "<br /><br />";
应该有$user
作为echo param
<?
$users = User::db_fields();
foreach($users as $user) {
echo $user . "<br /><br />";
?>
您每次都打印原始数组
修改强>
新错误反映了这样一个事实:您的User
类没有明确定义将类的对象转换为字符串的方法。如果你想做一个快速的脏输出,你可以var_dump()
你的对象,但最终你会想要覆盖__toString()
方法。检查this。
您也可以在User
类中创建一个函数,返回您想要的字符串,然后使用$user->StringifyUser()
调用它。这种方法的(主要)区别在于PHP在原始上下文中使用时不会隐式地将User
类对象转换为字符串。
编辑2:
我还会查看其他答案,特别是KyleK的答案,他解决了我没有涉及的几个关键点。
答案 1 :(得分:0)
你正在迭代的数组是$ users,你从$ users获得的值是$ user。
但是你回应了$ users(数组)。如果$ users数组中的值都是字符串(或其他一些标量值),那么将代码更改为:
<?
$users = User::db_fields();
foreach($users as $user) {
echo $user . "<br /><br />";
}
?>
(我最后还添加了你缺失的大括号)
答案 2 :(得分:0)
嗯......你静静地调用db_fileds()。
User::db_fields();
所以它需要是一个静态函数..
public static function db_fields() {
修改强>
你可以做一个解决方法......
更改您的查询
return static::find_by_sql("SELECT * FROM mytable LIMIT 1");
然后这样做......
$fields = User::db_fields();
foreach($fields as $key=>$value ) {
echo $key; // This will give the field name
}
编辑2
保留链接到字段的列名。
虽然这可能是错误的,因为现在它实例化了多次,并且在对象没有找到属性并且没有写入的情况下会发生什么,那么你会错过一个列。
但是这个想法就在那里......
while($row = $db->fetch_array($result_set)) {
foreach($row as $k=>$v){
$object_array[$k] = static::instantiate($row);
}
}