我的PHP库中有几个静态工厂模式.但是,内存占用空间不大,我们希望减少执行期间所需的文件数量.以下是我们今天的例子:
require_once('Car.php');
require_once('Truck.php');
abstract class Auto
{
// ... some stuff ...
public static function Create($type)
{
switch ($type) {
case 'Truck':
return new Truck();
break;
case 'Car':
default:
return new Car();
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是不可取的,因为即使只需要一个或另一个,也需要包含Car.php和Truck.php.据我所知,require/include和他们的......一旦变化包括与调用相同范围的库.这是真的?
如果是这样,我相信这会导致内存泄漏:
abstract class Auto
{
// ... some stuff ...
public static function Create($type)
{
switch ($type) {
case 'Truck':
require_once('Truck.php');
return new Truck();
break;
case 'Car':
default:
require_once('Car.php');
return new Car();
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,在第二个例子中,即使使用了require_once风格,多次调用Create()也会因为调用范围而导致多个需求.
这是真的?在这样的示例中,在php中动态包含库的最佳方法是什么?
谢谢!
我有一个函数,使用Php的DOMDocument替换字符串中的锚点'href属性.这是一个片段:
$doc = new DOMDocument('1.0', 'UTF-8');
$doc->loadHTML($text);
$anchors = $doc->getElementsByTagName('a');
foreach($anchors as $a) {
$a->setAttribute('href', 'http://google.com');
}
return $doc->saveHTML();
Run Code Online (Sandbox Code Playgroud)
问题是loadHTML($ text)围绕doctype,html,body等标签中的$ text.我尝试通过这样做而不是loadHTML()来解决这个问题:
$doc = new DOMDocument('1.0', 'UTF-8');
$node = $doc->createTextNode($text);
$doc->appendChild($node);
...
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会编码所有实体(包括锚点).有谁知道如何关闭它?我已经彻底查看了文档,并试图破解它,但无法弄明白.
谢谢!:)
我写了一个绝对定位的下拉菜单.此菜单打开时,我将触发自定义事件:
ps.DropDown.prototype._onOpenComplete = function() {
$(this).trigger('MENU_OPEN', [this]);
}
Run Code Online (Sandbox Code Playgroud)
当我知道要将ps.DropDown的哪个实例作为目标时,这很有效:
var dd = new ps.DropDown();
$(dd).on('MENU_OPEN', fn);
Run Code Online (Sandbox Code Playgroud)
但是,如果事件没有停止传播,我希望我的自定义事件冒泡到window.document.例如:
var dd = new ps.DropDown();
$(dd).on('MENU_OPEN', function(event, instance) {
// this would stop bubbling to $(window.document)
// event.stopPropagation();
});
$(window.document).on('MENU_OPEN', function(event, instance) {
// bubbled!
});
Run Code Online (Sandbox Code Playgroud)
有没有办法用jQuery实现这个目标?
编辑以类比的方式添加示例
单击按钮元素将触发事件.此事件将继续冒出父元素链,直到它到达window.document(除非传播被事件侦听器停止).我有兴趣为自定义事件合成这种行为,如果没有调用event.stopPropagation(),它将冒泡到window.document(或$ .event,或其他一些全局窗口,没关系)
我希望能够导入一个常用工具库,以便我更轻松地使用MongoDB.但是,我还没有发现将外部脚本轻松导入Mongo CLI.理想情况下,这将类似于Node.js要求.
如何在默认情况下要求在Mongo CLI中工作?
或者,是否有其他方法来解决外部库依赖?
我正在使用Rails.cache来缓存来自API的响应:
Rails.cache.fetch("key") do
api.get "/api/data"
api.body
end
Run Code Online (Sandbox Code Playgroud)
API不是很可靠,偶尔我会收到500错误.我想避免缓存500响应.
Rails.cache.fetch("key") do
api.get "/api/data"
if api.body.meta.status == 500
# Bail out, Goose!
end
api.body
end
Run Code Online (Sandbox Code Playgroud)
我宁愿不提出异常.没有缓存的"拯救"块的最佳方法是什么?
我需要增加我正在编写的模块可用的出站http套接字的数量.我知道可以使用以下方式全局执行此操作:
// increase max sockets
http.globalAgent.maxSockets = 1000;
Run Code Online (Sandbox Code Playgroud)
在不影响其他模块的情况下,创建模块的maxSocket限制的最佳模式是什么?
从命令行,我想从我的粘贴板(FYI:pbpaste是一个OSX功能)中获取一个脚本并将其传递到Node的repl命令行工具中.例如:
pbpaste | node -e
这不会评估剪贴板中的内容.如何让运行时执行此操作?
当我停止一个新贵作业时,默认情况下它使用 SIGTERM。我在 node.js 中捕获了 SIGTERM,如下所示:
process.on('SIGTERM', shutdownServerGracefully);
process.on('SIGINT', shutdownServerGracefully);
Run Code Online (Sandbox Code Playgroud)
我通过从终端运行它并发送 来验证这是否有效kill -s SIGTERM [pid]。这会触发正常关闭,我在日志中看到它。
我有一个新贵脚本,如下所示:
# Process will start after a network is available.
start on runlevel [2345]
stop on runlevel [016]
# Keep server running
respawn
respawn limit 5 30
# Wait 5 minutes for server to gracefully shutdown
kill timeout 300
# Allow for graceful shutdown
kill signal SIGTERM
normal exit 0 SIGTERM SIGINT SIGQUIT
chdir /var/web_server
script
# Environment variables
. /etc/environment
export NODE_ENV
# …Run Code Online (Sandbox Code Playgroud) 我ActiveRecord::ConnectionAdapters::PostgreSQLAdapter在Rails应用程序中使用.假设我有一个架构:
create_table "foo", id: :bigserial, force: :cascade do |t|
t.string "name"
t.jsonb "data", null: false
end
Run Code Online (Sandbox Code Playgroud)
现在假设我运行以下代码:
class Foo < ActiveRecord::Base
self.table_name = :foo
end
my_foo = Foo.create!(:name => 'foobar', :data => {:a => 'hello'})
my_foo = Foo.where(:name => 'foobar').first!
puts my_foo.data[:a]
puts my_foo.data['a']
Run Code Online (Sandbox Code Playgroud)
输出将是:
# nil
# 'hello'
Run Code Online (Sandbox Code Playgroud)
是否可以让ActiveRecord使用HashWithIndifferentAccess自动反序列化jsonb类型?
从facebook画布,我需要能够访问iframe窗口.通常您可以使用window.frames执行此操作,但FJBS似乎不允许访问窗口对象.
有没有人想出如何访问窗口对象?
我发现自己经常遇到错误,我用符号代替字符串访问哈希,反之亦然.我想要做:
require 'active_support/hash_with_indifferent_access'
Hash = HashWithIndifferentAccess
# (irb):xx: warning: already initialized constant Hash
Run Code Online (Sandbox Code Playgroud)
这个警告是因为已经定义了哈希,但我并不在乎.
当然,性能可能稍差.
当然,也许有些宝石会创建一个包含字符串和符号的哈希并且会破坏 - 但这有多常见?
这不好吗?反模式?我会后悔这样做吗?有什么缺点?有这样的好/坏经历吗?
我的办公室已经讨论过使用三元运算符.这次讨论有两个方面.
方面1)三元运算符易于编写和读取,因此便利性是节省的净成本.
方2)三元运算符难以维护,因为它们需要过多的代码流失,如果它们需要被修改为甚至稍微复杂一点.
额外的书呆子点,如果你能引用顶级机构在这个问题上所做的任何实际研究......我很有兴趣看到这方面的硬数据.
我的理论是,最好的代码是可以轻松改变和适应的代码,并且变化所需的复杂性越小,中断的可能性就越小.例:
$id = $user->isRegistered() ? $user->id : null;
Run Code Online (Sandbox Code Playgroud)
好的,所以这是完全有效的,但是当代码需要改变成稍微复杂的东西时会发生什么?
$id = null;
if ($user->isRegistered() || $user->hasEmail()) {
$id = $user->id;
}
Run Code Online (Sandbox Code Playgroud)
任何理智的程序员都会查看三元组并转换为标准if/else.但是,这需要进行4行更改,而不是从以下开始:
if ($user->isRegistered()) {
$id = $user->id;
}
Run Code Online (Sandbox Code Playgroud)
这只需要1行更改.
javascript ×2
node.js ×2
php ×2
ruby ×2
activerecord ×1
anchor ×1
caching ×1
command-line ×1
domdocument ×1
events ×1
facebook ×1
fbml ×1
formatting ×1
hash ×1
href ×1
http ×1
include ×1
jquery ×1
json ×1
linux ×1
mongodb ×1
polymorphism ×1
require ×1
require-once ×1
shell ×1
ubuntu ×1
upstart ×1