如果下拉列表没有选定值,是否有办法包含默认的空选项(或文本)?
我在http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx?cs-save-lang=1&cs-lang=csharp上阅读有关异步函数调用的内容.
在第一个例子中,他们这样做,我得到:
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
// You can do work here that doesn't rely on the string from GetStringAsync.
DoIndependentWork();
string urlContents = await getStringTask;
Run Code Online (Sandbox Code Playgroud)
但他们解释说,如果没有任何工作要做,你可以这样做:
string urlContents = await client.GetStringAsync();
Run Code Online (Sandbox Code Playgroud)
根据我的理解,await关键字将暂停代码流,直到函数返回.那么这有什么不同:
string urlContents = client.GetString();
Run Code Online (Sandbox Code Playgroud)
?
在为自定义应用程序设计专用ACL系统时出现了这个问题,但我认为它一般适用于ACL系统,因为我还没有找到如何通过查看一些主流系统来解决这个问题,例如Zend_ACL.
在我的应用程序中,权限是动态授予的,例如:用户获取活动的查看权限,因为他是活动链接到的团队的成员.这建立在这样的假设之上:您总是有一个Employee(用户)想要对(Item我的应用程序中的一个对象,例如Activity,Team等)执行操作(查看/编辑/ 等).这足以让我有针对性地使用;
$Activity = new Activity( $_POST['activity_id'] );
$Acl = new Acl( $Activity );
if ( !$Acl->check( 'edit' ) {
throw new AclException('no permission to edit');
}
Run Code Online (Sandbox Code Playgroud)
我的Acl类包含授予权限的所有业务规则,它们是"即时"创建的(虽然有时因性能原因而被缓存);
/**
* Check the permissions on a given activity.
* @param Activity $Activity
* @param int $permission (optional) check for a specific permission
* @return mixed integer containing all the permissions, or a bool when $permission is set
*/
public function checkActivity( Activity …Run Code Online (Sandbox Code Playgroud) isset()当属性名称在变量中时,为什么不起作用?
$Object = new stdClass();
$Object->tst = array('one' => 1, 'two' => 2);
$tst = 'tst'; $one = 'one';
var_dump( $Object, isset( $Object->tst['one'] ), isset( $Object->$tst[ $one ] ) );
Run Code Online (Sandbox Code Playgroud)
输出以下内容:
object(stdClass)#39 (1) {
["tst"]=>
array(2) {
["one"]=>
int(1)
["two"]=>
int(2)
}
}
bool(true)
bool(false) // was expecting true here..
Run Code Online (Sandbox Code Playgroud)
编辑:继续玩弄代码,并发现了
var_dump( $Object->$tst['one'] );
Run Code Online (Sandbox Code Playgroud)
输出通知:
E_NOTICE: Undefined property: stdClass::$t
Run Code Online (Sandbox Code Playgroud)
所以我认为问题在于,在$tst[...]从对象获取属性之前,在"字符串模式"(评估字符串中的第一个字符;在本例中为"t")中评估该部分;
var_dump( $tst, $tst['one'] ); // string(3) "tst" string(1) "t"
Run Code Online (Sandbox Code Playgroud)
解决方案:是在变量name($this->{$tst})周围加上大括号,告诉解释器首先检索它的值,然后计算[...] …
在我的应用程序设计中,我通常将对象映射到数据库中的重要表.然后,对象处理与该数据相关的所有内容(包括链接表).因此,我例如已经建立了一个Activity对象,具有类似性质name和due_date,方法等load()和save(),并且还方法等getParent(),getContributors()并且getTeam(),其返回(阵列)的其他对象.这是"坏"OOP,因为它违反了单一责任原则吗?
过去一周我一直在阅读Git,并试图找出如何将其融入我们的公司.那里有很多信息,除了其他资源,我发现Pro Git书非常有用.然而,有一件事对我来说仍然是一个谜(它也不在书中),是如何将Git存储库"链接"到我们的生产服务器上.
我们当前的设置包括一个我们都承诺的SVN服务器(我发现这可以通过在共享位置设置一个裸Git存储库并推送到它来等同).我们的生产服务器(有多个客户运行相同的PHP代码库)当前是SVN工作副本,我们通过运行一次手动更新一个svn up.
在Git中最好的方法是什么?我考虑过将生产服务器作为遥控器添加到我的Git存储库中并推送给他们,但我认为如果不同的服务器获得不同的推送历史,这可能会产生混淆(这将是你真正需要它集中的一个场合我猜测).或者你需要使用像https://github.com/mislav/git-deploy这样的工具吗?
我不禁感到Git开发者没有真正想过这个'..我希望我错过了什么:)
在调试一段耗尽内存的代码时,我发现了一个非常有趣的问题,最重要的是我不知道如何修复它.
该应用程序大致由一个Survey对象组成,该对象包含许多Question对象.问题对象包含对他们所处的调查的引用,例如,需要能够从其他问题中获取答案.
以下循环导致内存溢出:
foreach ( $survey_ids_arr as $survey_id ) {
$Survey = new Survey( $survey_id );
}
Run Code Online (Sandbox Code Playgroud)
Survey构造函数中没有发生异乎寻常的异常情况;
从查看代码开始,您会说在每次迭代中都会从内存中清除对象,因为$ Survey变量会被覆盖.对??错了:)
当脚本经过循环时,内存堆积 - 添加memory_get_usage()调用显示Survey对象使用的内存未按预期释放,此时另一个对象被分配给$Survey变量.即使unset( $Survey )在循环结束时调用也不会释放内存.
罪魁祸首是$this在创建时传递给Question对象的引用.这些引用阻止对象从内存中清除 - 正如php.net上的手册所述:
一旦删除了对特定对象的所有引用,就会调用析构函数方法
因此,阻止对象被清理的是它自身对它的引用.很好,对吧?:)
所以,问题是我的对象是记忆杀手.不幸的是,我想不出一个解决方案(除了编写一个丑陋的方法来清除问题并从循环中调用它).调查中的析构函数不是一个选项; 如上所述,因为 Question对象仍然有引用,所以不会调用它.
有任何想法吗?有人必须已经遇到这个问题 - 包含父对象的子对象不是一个不常见的架构,是吗?
我的一位同事写了一个耗尽可用内存的脚本.我将其缩小到以下基本测试用例:
for ( $i = 0; $i <= 20; $i ++ ) {
echo memory_get_usage(). '<br />';
$Survey = new Survey( 14 );
echo memory_get_usage(). '<br /><br />';
}
exit('done');
Run Code Online (Sandbox Code Playgroud)
这打破了第三次迭代:
3116696
49123440
49123440
95518368
95518368
[E_ERROR] Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes)
Run Code Online (Sandbox Code Playgroud)
我设法解决了这个问题,只需unset()在循环中添加一个调用:
for ( $i = 0; $i <= 20; $i ++ ) {
echo memory_get_usage(). '<br />';
$Survey = new Survey( 14 );
unset( $Survey );
echo memory_get_usage(). '<br …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,sections是一个courses由名为的属性链接的集合course.sectionIds.初始加载工作正常,但在管理面板中添加部分时,我遇到了非反应性连接问题.
这是路线:
@route 'adminCourse',
path: 'admin/course/:course'
waitOn: -> Meteor.subscribe 'course', @params.course
data: -> Course.first()
Run Code Online (Sandbox Code Playgroud)
这些部分包含在课程出版物中:
Meteor.publish 'course', ( courseId ) ->
return null if not this.userId
# [some permission checks]
courses = Course.find courseId
sections = Section.find _id: $in: _.flatten courses.map ( course ) -> course.sectionIds
[ courses, sections ]
Run Code Online (Sandbox Code Playgroud)
我知道反应性连接,但我不能真正使用方法#1或#4(过度发布和加入客户端),因为涉及权限检查(您应该只能看到自己的课程部分).此外,我知道数据何时发生变化,因此实际上并不一定要被动反应.
当用户提交表单以添加新部分时,我只想让Meteor知道重新加载数据(我目前正在通过在window.location.reload()添加部分后执行此操作来解决此问题).有没有办法用Meteor做到这一点?
对于我们的应用程序中的翻译,我们使用Zend Translate和gettext适配器.在每个模块中都有一个文件夹translations,其中包含所有语言的.mo文件;
通过以下addTranslation()方法扫描并添加:
if ( is_dir( $translations_dir ) ) {
foreach ( new DirectoryIterator( $translations_dir ) as $file ) {
if ( substr( $file, -3 ) == '.mo' ) {
$ZendTranslate->addTranslation( $file->getPathname(), $file->getBasename('.mo') );
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序中的字符串使用该_()方法进行翻译,将当前语言作为参数传递(它存储在我的框架的Language类中):
$ZendTranslate->_( $string, $this->language );
Run Code Online (Sandbox Code Playgroud)
现在我需要为特定客户定制Dutch(nl)语言字符串.我不想修改nl.mo文件,因为这会影响其他客户.所以我创建了一个名为nl_kpn.mo(kpn是客户名称)的文件,并切换$this->language到'nl_kpn'.我希望Zend Transate将其nl.mo作为基本文件,覆盖在其中找到的自定义字符串nl_kpn.mo.但不幸的是,我经历过,因为手册指出:
fr_CH将被降级为fr
因此所有字符串仍然来自nl.mo文件,即使$this->language设置为'nl_kpn'.那么如何创建一个更具体的语言版本,覆盖一般语言的字符串呢?一定是可能的,对吗?因为还有en_UK和en_US,它们是同一种语言的不同"方言".
php ×7
oop ×4
.net ×1
acl ×1
asp.net-mvc ×1
async-await ×1
asynchronous ×1
c# ×1
c#-5.0 ×1
deployment ×1
destructor ×1
gettext ×1
git ×1
html-select ×1
meteor ×1