他们说eval()是邪恶的.我想避免使用适当的PHP5功能使用eval()行.给定静态类方法中的类名,如何使其返回真实对象?
class Model {
public static function loadModel($sModelPath) {
if (!(strpos(' ' . $sModelPath, '/')>0)) {
$sModelPath .= '/' . $sModelPath;
}
$sModelName = str_replace('/','_',$sModelPath);
// P is a global var for physical path of the website
require_once(P . '_models/' . $sModelPath . '.php');
eval("\$oObject = new $sModelName" . '();');
return $oObject;
}
}
Run Code Online (Sandbox Code Playgroud) 我面临一个非常奇怪的问题,我从django驱动的站点获取JSON对象并使用eval()将其排除.除了所有版本的IE之外,它适用于所有其他浏览器.在IE中,我得到"variable_name"是null或不是对象.我尽我所能,但到目前为止还没有运气.
这是我的json对象
var results = {"result":[
{
"artist":"somevalue",
"song":"someothervalue",
"file":"filepathvalue",
"views":"0",
"songid":"1007",
"artistimage":"default.jpg"
},
{
"artist":"artistname",
"song":"songname",
"file":"anotherfilepath value",
"views":"0",
"songid":"1008",
"artistimage":"default.jpg"
},
],
"prev_page": "0",
"next_page": "2"
};
Run Code Online (Sandbox Code Playgroud)
注意:
alert(results.result[0].song)
Run Code Online (Sandbox Code Playgroud)
工作得很好,但是
$('#somediv').html('<span>'+results.result[0].song+'</span>');
Run Code Online (Sandbox Code Playgroud)
在IE中不起作用.任何的想法?
我尝试用变量名定义一个函数.
从数据库中检索名称.对于每个名称,我想定义一个按钮并具有单独的处理:
title=['BNL','CE']
for i in range(0,len(title)):
panelvpu.add(Button(title[i]))
for i in range(0,len(title)):
eval('def onButtonClick'+title[i]+'(self, event):')
eval(' Window.alert("Yes")')
Run Code Online (Sandbox Code Playgroud)
按钮定义没问题,但在定义的函数中处理事件会产生错误
im1 SyntaxError: at index 4 in "def onMenu1Item1(self):
Window.alert("Item 1 selected")": expected ';', got 'onMenu1Item1'
Run Code Online (Sandbox Code Playgroud)
在反馈之后我改变了这个
title=['BNL','CE']
for t in title : panelvpu.add(Button(t))
for t in title:
def_code = "print t"
exec(def_code)
Run Code Online (Sandbox Code Playgroud)
只是为了感受; 在python下这很好用.但我使用睡衣,最后一个代码确实是错误说明
im1 TypeError: iter is undefined
Run Code Online (Sandbox Code Playgroud)
看来睡衣还不支持eval()和exec().
理查德
我在matlab中的其他人的代码中遇到了函数eval(表达式)的使用:例如:
for n = 1 : 4
sn = int2str( n) ;
eval( [ 'saveas( fig' sn ', [ sName' sn ' ], ''fig'' ) ' ] );
end
Run Code Online (Sandbox Code Playgroud)
Matlab帮助中MathWorks的东西指出:
eval函数的许多常见用法效率较低,并且比其他MATLAB函数和语言结构更难以阅读和调试.
在此之后,我发现在许多其他程序语言中使用此函数,如Python,JavaScript,PHP.
所以我有几个问题:
我以前从未使用eval()过,所以我认为我的语法非常错误.以下是什么问题:
var JSONAsString = '{"item1":"one", "item2":"two", "item3":"three"}';
var JSONAsObject = eval(JSONString);
alert(JSONAsObject.item1);
Run Code Online (Sandbox Code Playgroud)
因为它似乎不起作用 - 我加载页面没有任何反应.
是的,我知道我不应该使用eval.我假设语法JSON.parse()与eval 的语法相同......对吗?如果是,如果(在修复代码之后)我用ESON.parse替换eval,它还会做同样的事情吗?
我试图在jQuery中创建动态变量.我尝试使用eval()它似乎工作正常,但我不认为eval()是一个jQuery函数.eval()jQuery中是否存在等价?在这里查看我的代码:http://jsfiddle.net/3CXgy/
var test = function(pos) {
alert(eval('COUNT_'+pos));
}
var COUNT_LEFT = 20;
var COUNT_RIGHT = 30;
test('LEFT');
test('RIGHT');
Run Code Online (Sandbox Code Playgroud)
除了使用之外,还有不同的方法eval()吗?我不确定eval()在上面的例子中是否完全没问题.
我正在解析一个大的EMBL文件(> 1G)并将其转换为gff文件.它有一些条目与传统的embl形成不匹配,因此导致bioperl模块抛出异常.我的问题是,因为有错误的条目只是整个序列的一小部分,我想继续编写脚本,暂时忽略该异常.但perl脚本始终由异常停止.
我在Linux操作系统下,使用perl版本5.8.8
我的perl脚本
use strict;
use Bio::SeqIO;
use Bio::Tools::GFF;
use warnings;
use Try::Tiny;
open (E ,">","emblError.txt");
if (@ARGV != 1) { die "USAGE: embl2gff.pl > outputfile.\n"; }
my $in = Bio::SeqIO->new(-file=>$ARGV[0],-format=>'EMBL');
eval {
while (my $seq = $in->next_seq) {
for my $feat ($seq->top_SeqFeatures) {
my $gffio = Bio::Tools::GFF->new(-gff_version => 3);
print $feat->gff_string($gffio)."\n";
}
}
};
if ($@) {
warn "Oh no! [$@]\n";
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误
Name "main::E" used only once: possible typo at embl2GFF3.pl line 7.
--------------------- WARNING ---------------------
MSG: …Run Code Online (Sandbox Code Playgroud) 我听过很多关于eval函数"邪恶"甚至"误解"的谣言,所以我决定将它从我的代码中删除.问题是我不知道用什么来代替它.
这是我当前代码的快速概述.我在开头声明了一系列数组(下面的例子只有2个),然后基于按钮单击其中一个被加载到传递给函数的变量中.
这是一些基本的HTML
<div class="button" data-name="button1">Button1</div>
<div class="button" data-name="button2">Button2</div>
Run Code Online (Sandbox Code Playgroud)
和JS(用jQuery)
var butName = null;
var eArray = null;
var button1Logo = ["..path/to/pic1.png","..path/to/pic2.png"];
var button2Logo = ["..path/to/pic3.png","..path/to/pic4.png"];
$(".button").mouseup(function(){
/*give a butName*/
butName = $(this).attr("data-name");
/*give the array from the button*/
eArray = eval(butName + "Logo");
});
Run Code Online (Sandbox Code Playgroud)
这样做会将数组分配给变量而不仅仅是一个表示"butnameLogo"的字符串,这就是我使用eval的原因.但我希望摆脱这种局面.
我知道我可以为html添加一个新属性,只是为变量检索它,但是当我可以用JS做的时候我不想添加更多的html.
我还尝试使用加载到其中的字符串创建一个对象,如下面的答案所示:https://stackoverflow.com/a/16038097/1621380 但这又导致了一个字符串,而不是分配变量.
想知道你是否聪明的人有更好的建议!
Laular AngularJS(1.3 beta 19)使用eval.这在铬镀铬中是禁止的.
如何解决问题而不允许进行贬值?
错误信息:
拒绝将字符串评估为JavaScript,因为"unsafe-eval"不是以下内容安全策略指令中允许的脚本源:"script-src'self'chrome-extension-resource:".
堆栈跟踪:
angular.js:1011
csp angular.js:1011
(anonymous function) angular.js:23556
Run Code Online (Sandbox Code Playgroud)
更新:请参阅https://docs.angularjs.org/api/ng/directive/ngCsp的文档ng-csp
OUTDATED:看起来AngularJS无法在chrome扩展中检测到CSP.使用显式ng-csp.链接到AngularJS问题:https://github.com/angular/angular.js/issues/8777
我正在从一系列过滤器创建一个where子句的字符串.
var where_clause_string = "(((true && ['SACRAMENTO','CITRUS HEIGHTS'].indexOf(raw_data[i]['city']) > -1) || (false && [].indexOf(raw_data[i]['city']) === -1)) || false)";
var raw_data_length = raw_data.length
, filtered_data = [];
for(var i = 0; i < raw_data_length; i++) {
if (eval(where_clause_string)) {
filtered_data.push(raw_data[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我迭代数据,这是一个对象数组,只返回通过真值测试的对象.
它给出了预期的结果,但性能却被搞砸了.过滤仅1500行需要约2-3秒.如果在不使用eval()的情况下对条件进行硬编码,则该过程非常快.
实现这一目标的替代方法是什么?