小编Rij*_*ijk的帖子

带有默认空选项的ASP.NET MVC下拉列表

如果下拉列表没有选定值,是否有办法包含默认的空选项(或文本)?

asp.net-mvc html-select html.dropdownlistfor

79
推荐指数
2
解决办法
7万
查看次数

async w/await与同步调用有何不同?

我在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)

.net c# asynchronous async-await c#-5.0

17
推荐指数
2
解决办法
5086
查看次数

构建"双向"OO动态ACL系统

在为自定义应用程序设计专用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)

php oop acl design-patterns

16
推荐指数
1
解决办法
1651
查看次数

带有动态属性名称的isset()

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})周围加上大括号,告诉解释器首先检索它的,然后计算[...] …

php oop

10
推荐指数
1
解决办法
2811
查看次数

OOP中的单一责任原则

在我的应用程序设计中,我通常将对象映射到数据库中的重要表.然后,对象处理与该数据相关的所有内容(包括链接表).因此,我例如已经建立了一个Activity对象,具有类似性质namedue_date,方法等load()save(),并且还方法等getParent(),getContributors()并且getTeam(),其返回(阵列)的其他对象.这是"坏"OOP,因为它违反了单一责任原则吗?

php oop single-responsibility-principle

9
推荐指数
1
解决办法
2157
查看次数

从Git部署代码到生产服务器

过去一周我一直在阅读Git,并试图找出如何将其融入我们的公司.那里有很多信息,除了其他资源,我发现Pro Git书非常有用.然而,有一件事对我来说仍然是一个谜(它也不在书中),是如何将Git存储库"链接"到我们的生产服务器上.

我们当前的设置包括一个我们都承诺的SVN服务器(我发现这可以通过在共享位置设置一个裸Git存储库并推送到它来等同).我们的生产服务器(有多个客户运行相同的PHP代码库)当前是SVN工作副本,我们通过运行一次手动更新一个svn up.

在Git中最好的方法是什么?我考虑过将生产服务器作为遥控器添加到我的Git存储库中并推送给他们,但我认为如果不同的服务器获得不同的推送历史,这可能会产生混淆(这将是你真正需要它集中的一个场合我猜测).或者你需要使用像https://github.com/mislav/git-deploy这样的工具吗?

我不禁感到Git开发者没有真正想过这个'..我希望我错过了什么:)

php git deployment

7
推荐指数
1
解决办法
2976
查看次数

使用对自身的引用来破坏对象

在调试一段耗尽内存的代码时,我发现了一个非常有趣的问题,最重要的是我不知道如何修复它.

该应用程序大致由一个Survey对象组成,该对象包含许多Question对象.问题对象包含对他们所处的调查的引用,例如,需要能够从其他问题中获取答案.


以下循环导致内存溢出:

foreach ( $survey_ids_arr as $survey_id ) {
    $Survey = new Survey( $survey_id );
}
Run Code Online (Sandbox Code Playgroud)

Survey构造函数中没有发生异乎寻常的异常情况;

  • 从数据库中获取其属性
  • 从数据库中提取所有问题的属性
  • 为每个问题创建一个Question对象(将引用传递给$ this)
  • 将所有Question对象添加到内部数组

从查看代码开始,您会说在每次迭代中都会从内存中清除对象,因为$ Survey变量会被覆盖.对??错了:)

当脚本经过循环时,内存堆积 - 添加memory_get_usage()调用显示Survey对象使用的内存未按预期释放,此时另一个对象被分配给$Survey变量.即使unset( $Survey )在循环结束时调用也不会释放内存.


罪魁祸首是$this在创建时传递给Question对象的引用.这些引用阻止对象从内存中清除 - 正如php.net上的手册所述:

一旦删除了对特定对象的所有引用,就会调用析构函数方法

因此,阻止对象被清理的是它自身对它的引用.很好,对吧?:)

所以,问题是我的对象是记忆杀手.不幸的是,我想不出一个解决方案(除了编写一个丑陋的方法来清除问题并从循环中调用它).调查中的析构函数不是一个选项; 如上所述,因为 Question对象仍然有引用,所以不会调用它.

有任何想法吗?有人必须已经遇到这个问题 - 包含父对象的子对象不是一个不常见的架构,是吗?

php oop destructor

6
推荐指数
1
解决办法
239
查看次数

未明确取消设置时的exessive对象内存使用情况

我的一位同事写了一个耗尽可用内存的脚本.我将其缩小到以下基本测试用例:

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)

php garbage-collection

6
推荐指数
1
解决办法
372
查看次数

如何强制Meteor重新加载订阅?

在我的应用程序中,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做到这一点?

meteor

6
推荐指数
2
解决办法
4062
查看次数

覆盖gettext .mo文件

对于我们的应用程序中的翻译,我们使用Zend Translate和gettext适配器.在每个模块中都有一个文件夹translations,其中包含所有语言的.mo文件;

  • da.mo
  • nl.mo
  • en.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 gettext internationalization zend-translate

5
推荐指数
1
解决办法
1083
查看次数