为啥我不能在其他类或函数中使用我的 Propel ORM 类?

Posted

技术标签:

【中文标题】为啥我不能在其他类或函数中使用我的 Propel ORM 类?【英文标题】:Why can I not use my Propel ORM classes inside of other classes or functions?为什么我不能在其他类或函数中使用我的 Propel ORM 类? 【发布时间】:2012-02-08 11:19:47 【问题描述】:

此代码有效:

  1 <?
  2 
  5 require( '/var/www/Propel/runtime/lib/Propel.php' );
  6 // Initialize Propel with the runtime configuration
  7 Propel::init("/home/foo/Projects/bar/classes/orm/build/conf/myconfig-conf.php");
  8 // Add the generated 'classes' directory to the include path
  9 set_include_path( $_SERVER['DOCUMENT_ROOT'] . "/classes/orm/build/classes/" . get_include_path());
 10 
 11 $PQ = new ProjectsQuery();
 12 $projects = ProjectsQuery::create()->find();
 13 print_r( $projects );
 15 
 16 ?>

但是,如果我将完全相同的代码放在类或函数中(我将在本示例中使用函数),则会出现错误,并且对象不是 print_r

  1 <?
  2 
  3 require( '/var/www/Propel/runtime/lib/Propel.php' );
  4 // Initialize Propel with the runtime configuration
  5 Propel::init("/home/foo/Projects/bar/classes/orm/build/conf/myconfig-conf.php");
  6 // Add the generated 'classes' directory to the include path
  7 set_include_path( $_SERVER['DOCUMENT_ROOT'] . "/classes/orm/build/classes/" . get_include_path());
  8 
  9     public function foo()
 10        
 11         $PQ = new ProjectsQuery();
 12         $projects = ProjectsQuery::create()->find();
 13         print_r( $projects );
 14        
 15 ?>   

我在日志文件中遇到的错误说

[2012 年 2 月 8 日星期三 03:03:02] [错误] [客户端 x.x.x.x] PHP 致命错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 你有一个错误你的 SQL 语法;检查与您的 mysql 服务器版本相对应的手册,以在 /var/www/Propel/runtime/lib/query/ModelCriteria.php:1284 中的第 1 行的“FROM”附近使用正确的语法\n堆栈跟踪:\n# 0 /var/www/Propel/runtime/lib/query/ModelCriteria.php (1284): PDOStatement->execute()\n#1 /var/www/Propel/runtime/lib/query/ModelCriteria.php(1137) : ModelCriteria->doSelect(Object(PropelPDO))\n#2 /home/foo/Projects/bar/models/Projects.php(12): ModelCriteria->find()\n#3 /home/foo/Projects/ bar/controllers/Projects.php(11): foo()\n#4 /home/foo/Project s/bar/project-listings.php(6): Projects->__construct()\n#5 main \n\n下一个异常“PropelException”,带有消息“无法执行 SELECT 语句 [SELECT FROM] [包装:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查第 1287 行 /var/www/Propel/runtime/lib/query/ModelCriteria.php 中与 yo 对应的手册

有更多 Propel ORM 经验的人可以告诉我如何在类或函数中使用 propel。只能以我提到的第一种方式使用它是行不通的。我只是使用直接的php。没有框架或其他任何东西。

【问题讨论】:

是我自己还是那个错误信息中有语法错误? 【参考方案1】:

这里没有包括的是foo() 函数的实际调用,这可能隐藏了真正的问题。如果您从与包含 foo() 的文件所在的目录不同的目录调用它,则 $_SERVER['DOCUMENT_ROOT'] 可能会有所不同,因此将您的 include_path 更改为实际上不指向 Propel 类。

在第 7 行设置 get_include_path() 后尝试打印出来,看看你有什么,确保 Propel 文件的完整路径是正确的。

【讨论】:

以上是关于为啥我不能在其他类或函数中使用我的 Propel ORM 类?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在 PHP 中重载构造函数?

为啥我不能从其他类访问公共变量?

为啥类或接口不能接收私有或受保护的访问修饰符?

Sources 文件夹中的文件无法访问 Xcode 游乐场中其他文件的公共类或函数

为啥我不能在我的回调中调用我的 vue 组件的函数[关闭]

为啥我不能运行程序直到游戏结束