目前我正在尝试学习Zend Framework,因此我买了"Zend Framework in Action"这本书.
在第3章中,介绍了基本模型和控制器以及它们的单元测试.基本控制器如下所示:
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
$this->view->title = 'Welcome';
$placesFinder = new Places();
$this->view->places = $placesFinder->fetchLatest();
}
}
Run Code Online (Sandbox Code Playgroud)
Places是从数据库中获取最新位置的模型类.什么错误我在这里:我应该如何测试IndexController在隔离?由于对Places类的引用是"硬编码",我无法注入任何存根或模拟IndexController.
我宁愿拥有的是这样的:
class IndexController extends Zend_Controller_Action
{
private $placesFinder;
// Here I can inject anything: mock, stub, the real instance
public function setPlacesFinder($places)
{
$this->placesFinder = $places;
}
public function indexAction()
{
$this->view->title = 'Welcome';
$this->view->places = $this->placesFinder->fetchLatest();
}
}
Run Code Online (Sandbox Code Playgroud)
我发布的第一个代码示例绝对不是单元测试友好的,因为IndexController不能单独测试.第二个好多了.现在我只需要一些方法将模型实例注入控制器对象.
我知道Zend …
在阅读了基于文件的PHP会话如何不是最佳性能之后,我想到了.这是否意味着包含大量文件的PHP脚本也不好?由于它包含文件或与会话数据文件的检索方式不同?
我现在正在使用PHP类和对象.在这个问题中,字段和方法的名称只是为了让你了解我在说什么.
它与使用单例和注册表设计模式有关.
现在假设我需要访问数据库对象,缓存对象,核心设置对象,几乎所有其他类中的Session对象,我需要访问这些对象.所以我会使用注册表将所有这4个对象存储到1个注册表类对象中.然后我可以将easiyl传递给我的1个对象到需要访问这些对象的任何其他对象.所以这听起来很棒,但是如果我有一些不需要所有4个对象的类,那么如果我只需要在我的其他一些类中访问Database对象或Session对象呢?对于性能,最好只在这些其他对象中使用单例,还是继续使用我的注册表?
我不太清楚PHP中的对象如何工作以了解是否会有任何类型的性能增益(更少的内存使用,CPU使用,加载时间).
因此,任何有这方面经验的人都可以告诉我,如果使用其中一个获得任何收益,我现在处于以太流行的阶段,而不影响生产时间或任何事情.如果我能够,我想用最好的方法.
我有一个名为Parameters的对象,它跨越包边界从方法到方法向下和向上抛出调用树.它有大约五十个状态变量.每种方法可能使用一个或两个变量来控制其输出.
我认为这是一个坏主意,因为我不能轻易看到方法需要运行什么,甚至如果模块Y的某些参数组合与我当前的模块完全无关,可能会发生什么.
有什么好的技术可以减少与这个神对象的耦合,或者理想地消除它?
public void ExporterExcelParFonds(ParametresExecution parametres)
{
ApplicationExcel appExcel = null;
LogTool.Instance.ExceptionSoulevee = false;
bool inclureReferences = parametres.inclureReferences;
bool inclureBornes = parametres.inclureBornes;
DateTime dateDebut = parametres.date;
DateTime dateFin = parametres.dateFin;
try
{
LogTool.Instance.AfficherMessage(Variables.msg_GenerationRapportPortefeuilleReference);
bool fichiersPreparesAvecSucces = PreparerFichiers(parametres, Sections.exportExcelParFonds);
if (!fichiersPreparesAvecSucces)
{
parametres.afficherRapportApresGeneration = false;
LogTool.Instance.ExceptionSoulevee = true;
}
else
{
Run Code Online (Sandbox Code Playgroud)
来电者会:
PortefeuillesReference pr = new PortefeuillesReference();
pr.ExporterExcelParFonds(parametres);
Run Code Online (Sandbox Code Playgroud) 所以....
显然,很多问题都是关于单身人士,全球状态变量以及所有伟大的东西.我的问题是,
如果Singletons和Globals太糟糕了,他们为什么经常这么用?
下面的例子很简单,我相信很多人都会使用这些例子.
我从CodeIgniter给你一个使用伪单例函数的函数:
(system\codeigniter\Common.php第89行)
/**
* Class registry
*
* This function acts as a singleton. If the requested class does not
* exist it is instantiated and set to a static variable. If it has
* previously been instantiated the variable is returned.
*
* ......
*/
function &load_class($class, $instantiate = TRUE)
{
static $objects = array();
// Does the class exist? If so, we're done...
if (isset($objects[$class]))
{
return $objects[$class];
}
.......
}
Run Code Online (Sandbox Code Playgroud)
通过将每个对象放入单个注册表中,您无法使用其load_class函数来创建任何内容的多个实例.当您想要将类用作数据结构时,这尤其不方便.
此外,因为所有这些类只有一个实例,所以它会导致反对全球状态的论点.这导致我.....
整个Wordpress系统,主要运行全局变量.循环遍历帖子的所有数据都散布在各种全局变量中. …
我有一个1.9MB的PHP库,我在脚本的开头包含了这个库.它包含我的网站所需的所有数据库对象,方法等.每次包含它需要0.1s至0.3s.
我使用eAccelerator来缓存这个文件的字节码.我还能做些什么来优化这个'包含'的性能?
我正在尝试使用PDO Prepare语句创建一个从MySQL表中提取页面内容的函数.我的代码在我定义的函数之外工作得很好,但无论我做什么它都不能在函数内工作 - 我收到以下错误:
致命错误:在第6行的/home/tappess1/public_html/pages/stations.php中调用非对象的成员函数prepare()
这是我的PHP:
function getPageContent($page) {
$st = $db->prepare("SELECT * FROM content WHERE title LIKE ?");
$st->execute(array($page));
$pageContent = $st->fetch();
$text = wordwrap($pageContent['content'], 100, "\n");
$tabs = 4;
$text = str_repeat(chr(9), $tabs) . str_replace(chr(10), chr(10) . str_repeat(chr(9), $tabs), $text);
echo $text;
}
Run Code Online (Sandbox Code Playgroud)
然后
<?php getPageContent(Main);?>
Run Code Online (Sandbox Code Playgroud)
我甚至尝试使用查询而不是prepare语句,只需调用getPageContent()并收到相同的错误.
谢谢!
我如何使用最初在整个站点中加载的对象实例?
我希望$ myinstance可以在任何地方使用.
$myinstance = new TestClass();
Run Code Online (Sandbox Code Playgroud)
谢谢!
我有一个PHP应用程序,需要半频繁的代码更新.我现在所做的是,每当我必须上传新脚本时,我都会关闭应用程序进行维护,有效地为除了我自己之外的所有用户关闭应用程序.
如果我不这样做,我总是在日志中看到很多"意外的$ end"错误消息,因为PHP试图解释半上传的脚本.我当然希望避免.
我的问题是:是否有一种安全的方法可以在不将应用程序停止维护的情况下执行此操作?在具有大量并发用户的环境中,上传到临时目录然后在服务器上本地移动文件的速度是否足以避免这些错误?它可以以某种方式自动化以方便工作流程吗?
谢谢!
就像现在一样,我将我的类系统嵌入到我的核心类中.所以我这样称呼我的课程:
$cms->userClass->function();
Run Code Online (Sandbox Code Playgroud)
但这意味着对于我在userClass中的每个函数,我总是需要添加:
global $cms;
Run Code Online (Sandbox Code Playgroud)
为此能够访问数据库类:
$cms->db->function();
Run Code Online (Sandbox Code Playgroud)
有没有办法为整个类设置全局,而不是必须在每个函数的开头定义它?
php ×9
oop ×2
performance ×2
class ×1
codeigniter ×1
file-upload ×1
function ×1
god-object ×1
instance ×1
object ×1
pdo ×1
refactoring ×1
registry ×1
singleton ×1
wordpress ×1