我想做这样的事情:
development {
dataSource {
dbCreate = "update"
driverClassName = "org.postgresql.Driver"
username = "usrcastor"
url = "jdbc:postgresql://localhost:5432/dbcastor_master"
password = "castor"
dialect = net.sf.hibernate.dialect.PostgreSQLDialect
pooled = true
loggingSql = false
}
dataSource_otherDataSource {
dbCreate = "update"
driverClassName = "org.postgresql.Driver"
username = "usrcastor"
url = "jdbc:postgresql://localhost:5432/dbcastor_child_a"
password = "castor"
dialect = net.sf.hibernate.dialect.PostgreSQLDialect
pooled = true
loggingSql = false
}
}
诀窍是:当用户想要在他们的classes.php中添加一个脚本时,他们只需要调用static mapping {
datasource 'ALL'
}
生成页面时,将调用函数<?php
function addScript($name, $url) {
$scripts[$name] = $url;
}
function displayScripts() {
foreach ($scripts as $name => $url) {
echo '<!-- Script: '.$name.' -->';
echo '<script src="'.$url.'"></script>'
}
}
并将所有脚本放在文件的头部。
出于显而易见的原因,我通常只会传递addScript('jQuery','http...');
数组,但我不希望用户这样做。另外,displayScripts();
如何知道$scripts
数组?
我希望用户只调用displayScripts()
,而不是我的代码中的逻辑。
问题是,数组$scripts
应该类似于addScript('jQuery','http...');
,但据我所知,你应该避免使用$scripts
。
有没有人知道如何做到这一点?
答案 0 :(得分:2)
这是variable scope的问题,理论上你可以在全局范围内为脚本设置一个数组,然后由其他函数和整个文件访问:
<?php
// globally defined
$scripts = array();
function addScript($script) {
global $scripts;
$scripts[] = $script;
}
...
等等。这显然会污染全球空间,并且所有类型的ovf变量都可用,有效地声称这些变量名称被安全使用。
更好的解决方案是使用某种类型的注册表。理想情况下,您可以使用某种容器创建并跟踪此注册表。但是例如,让我们使用标准的单例模式。 see this SO question for more info
class Scripts
{
// static instance tracker
protected static $instance;
// the registry for the scripts
protected $scripts = array();
// static function to fetch the instance
public static function getInstance()
{
if (!self::$instance) self::$instance = new Scripts();
return self::$instance;
}
// protected constructor, we dont want anybody to create an instance
protected function __construct() {}
public function addScript($script) {
$this->scripts[] = $script;
return $this;
}
public function getScripts() {
return $this->scripts;
}
public function renderTags() {
foreach ($this->scripts as $script) {
// render the html <script> tags and return html
}
}
}
现在您有一个安全的注册表,您可以在其中存储脚本,可以在包含该类的任何位置使用:
// somewhere in the code
Scripts::getInstance()->addScript('jquery.js')->addScript('jquery.ui.js');
// in the view rendering stage:
echo Scripts::getInstance()->renderTags();
我鼓励你阅读设计模式和单身人士,因为从长远来看,后者确实存在一些问题。您可以在this SO question
中找到更多信息答案 1 :(得分:1)
您可以在一个类中执行此操作,因此$scripts
变量可用于每个方法:
<?php
class Scripts{
public $scripts = array();
function addScript($name, $url) {
$this->scripts[$name] = $url;
}
function displayScripts() {
foreach ($this->scripts as $name => $url) {
echo '<!-- Script: '.$name.' -->';
echo '<script src="'.$url.'"></script>'
}
}
}
然后你就可以使用它:
$sm = new Scripts;
$sm->addScript('jQuery', '...');
$sm->displayScripts();