小编Dan*_*ugg的帖子

PHP闭包和隐式全局变量范围

有没有办法可以隐含地将顶级变量声明为闭包中使用的全局变量?

例如,如果使用如下代码:

$a = 0; //A TOP-LEVEL VARIABLE

Alpha::create('myAlpha')
    ->bind(DataSingleton::getInstance()
        ->query('c')
    )
    ->addBeta('myBeta', function($obj){
        $obj->bind(DataSingleton::getInstance()
                ->query('d')
            )
            ->addGamma('myGamma', function($obj){
                $obj->bind(DataSingleton::getInstance()
                        ->query('a')
                    )
                    ->addDelta('myDelta', function($obj){
                        $obj->bind(DataSingleton::getInstance()
                            ->query('b')
                        );
                    });
            })
            ->addGamma('myGamma', function($obj){

                $a++; //OUT OF MY SCOPE

                $obj->bind(DataSingleton::getInstance()
                        ->query('c')
                    )
                    .
                    .
                    .
Run Code Online (Sandbox Code Playgroud)

从这样的方法调用闭包:

    public function __construct($name, $closure = null){
        $this->_name = $name;
        is_callable($closure) ? $closure($this) : null;
    }
Run Code Online (Sandbox Code Playgroud)

所以在summary/TL; DR中,有没有一种方法可以隐式地将变量声明为全局,以便在不使用global关键字或$GLOBALS超全局的闭包(或其他函数)中使用?

我在另一个频繁的论坛上开始讨论这个话题(http://www.vbforums.com/showthread.php?p=3905718#post3905718)

php closures scope global-variables anonymous-function

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

MVC混乱; 排除模型责任和结构

我对过去几周/几个月的MVC类型架构的理解已经大大提升了(我会说),我非常感谢SO的爱好者们.所以谢谢!

我仍然受到某种挑战的挑战Model.到目前为止,我已整理并创建;

  • 一个简单的Request对象,它整合了请求数据(GET/POST/etc.参数,HTTP标头等)
  • 一个简单的Response对象,用于收集响应数据(HTML,JSON,HTTP标头等)
  • 一种Router对正则表达式驱动的路由表解析URI 的想法,基于Controller文件/类存在/继承验证它们,并Request使用任何补充参数更新对象.
  • 一个简单的Dispatcher对象,用于设置工作环境,创建和初始化必要的对象Controller,并将其RequestResponse对象一起发送.

现在了Model.

据我所知,在很多(有些)情况下,Model仅仅是代表性的它相关的实体,表,带有CRUD方法(addUser(),deleteUser()),在另一些国家也有抽象的进一步水平,防止控制器访问进行更加细致的CRUD功能,巩固方法(replaceUser()- 删除,添加,然后返回用户数据)

我想知道我最好的行动方式是什么; 由于一些具体原因.

我创建了一个Gateway类,它充当预期的Model执行ACL检查的代理(使用Acl对象,特殊情况" Model"),使用Request所需的方法和参数作为检查的参数.该Controller负责确定失败的ACL检查的结果(显示所有但是该数据,重定向等等)

我还介绍了一个(我以前称之为混合REST/RPC,但我认为这是不正确的,因为我的资源URI架构是窗口外的)RPC API层.API调用由一个方法,参数和请求参数组成,由特殊管理,ApiController并像正常Model调用一样被馈送Gateway.

在我看来,这是促进数据访问的最佳方式,是一个(呃 - 哦)单个巨大的模型对象,忽略任何维护所有数据库交互方法的ORM,证明管理网关/ ACL /模型关系的简单性.不,这听起来不对.

鉴于这些建筑选择,我可能是建模我的最佳选择,嗯.. Model?我是否真的通过前面提到的设计选择谨慎和最佳实践?

php model-view-controller model

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

在PHP中初始化属性

虽然我被认为可能只是一个设计选择,但将PHP中的属性初始化为显式是否有任何优势null

作为一种习惯的力量,我发现自己在做:

// ...
protected $_foo = null;
protected $_bar = null;
protected $_baz = null;
// ...
Run Code Online (Sandbox Code Playgroud)

当然,在实际数据打算出现在对象实例化的情况下,有目的:

// ...
protected $_array = array('a', 'b', 'c');
protected $_boolean = true;
// ...
Run Code Online (Sandbox Code Playgroud)

是否遗漏null初始化值功能上完全等同于包含null初始化?还有其他警告吗?此外,除非在进行任何赋值之前对属性进行类型检查,否则对空数组的初始化似乎是类似的情况(我发现自己经常这样做)

php

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

内联jQuery; 选择相对于脚本标记

这有点傻,因为它反对解放Javascript的标记,但不管怎么说我都会问.

鉴于此片段:

<p>Hello</p>
<script type="text/javascript">
    $(document).ready(function(){
        $('relative-selector').next('p').hide();
    });
</script>
<p>World</p>
Run Code Online (Sandbox Code Playgroud)

此片段将<script>使用此" 相对选择器 " 定位标记本身,.next('p').hide()并将导致<p>World</p>隐藏.

是否存在" 相对选择器 ",或者指定给定代码段所在的脚本标记的方法?

我正在寻找的答案(如果存在这样的答案)将不需要使用id属性或任何此类识别属性; <script>无论DOM树中的位置如何,它都可以在给定文档中使用任意数量的标记.

我已经看到了一些不使用的奇怪实现$(document).ready(),而是依赖于剩余标记未加载,使用$('script:last')或某些此类混合的事实.这不是我想要的; 我想要.bind()一些处理程序相对于绑定脚本片段的元素(通常在之后,这就是为什么卸载的标记技巧不起作用)

$(this)document由于ready处理程序而简单地定位对象.$(this)在负载延迟处理程序目标之外window.

我已经几乎已经接受了这可能是不可能的,但是我确定是否存在任何解决方案,它在SO用户的脑海中漂浮.

jquery jquery-selectors

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

Func <MyType>隐式转换为MyType

鉴于以下课程:

public class MyType
{
    public static implicit operator MyType(Func<MyType> wrapper) {
        return wrapper();
    }
}
Run Code Online (Sandbox Code Playgroud)

从隐式演员Func<MyType>MyType,我假设以下是可能的:

public MyType MyTypeWrapper() {
    return new MyType();
}

public void MyTestMethod() {
    MyType m = MyTypeWrapper; // not a call!
}
Run Code Online (Sandbox Code Playgroud)

但是我得到了:

无法将方法组"MyTypeWrapper"转换为非委托类型"Test.MyType".你打算调用这个方法吗?

其中,不幸的是对我,对搜索时(如我预期的一半),导致 问题,这个问题的答案是:

嘿,你打瞌睡; 折腾()结束了WhateverMethod!

现在,当我输入这个时,我注意到显式转换实际上是编译的:

MyType m = (MyType) MyTypeWrapper;
Run Code Online (Sandbox Code Playgroud)

为什么我不能隐式转换一个Func<MyType>MyType为我所描述?

c# callback implicit-conversion

9
推荐指数
2
解决办法
349
查看次数

__callStatic(),call_user_func_array(),引用和PHP 5.3.1

我一直在阅读SO和其他地方,但我似乎无法找到任何结论.

有没有办法通过此调用堆栈有效地携带引用,从而产生所需的功能,如下面的示例所述?虽然该示例并未尝试解决此问题,但它确实说明了问题:

class TestClass{
    // surely __call would result similarly
    public static function __callStatic($function, $arguments){
        return call_user_func_array($function, $arguments);
    }
}

// note argument by reference
function testFunction(&$arg){
    $arg .= 'bar';
}

$test = 'foo';
TestClass::testFunction($test);

// expecting: 'foobar'
// getting:   'foo' and a warning about the reference
echo $test;
Run Code Online (Sandbox Code Playgroud)

为了激发潜在的解决方案,我将在此处添加摘要详细信息:

只关注call_user_func_array(),我们可以确定(至少在PHP 5.3.1中)你不能通过引用隐式传递参数:

function testFunction(&$arg){
    $arg .= 'bar';
}

$test = 'foo';
call_user_func_array('testFunction', array($test));
var_dump($test);
// string(3) "foo" and a warning about the non-reference parameter
Run Code Online (Sandbox Code Playgroud)

通过显式传递数组元素$test …

php pass-by-reference magic-methods dynamic-function

8
推荐指数
1
解决办法
5637
查看次数

实现ACL约束,超过允许/拒绝

我已经开发了一个小而有效的MVC样式框架,用于应用程序,我正在实现ACL每请求检查.

快速详情:PHP 5.3+; MySQL 5.1+; 自定义框架,"类似MVC"

截至目前,ACL检查很简单" deny-if-not white-listing "; 每个都group可以被分配给某些请求处理程序的权限.例如:

privilege                       permission
+----------+---------------+    +---------------+---------------+
| group_id | permission_id |    | permission_id | handler_key   |
+----------+---------------+    +---------------+---------------+
|     1    |       1       |    |       1       | lorem_ipsum   |
|     1    |       2       |    |       2       | hello_world   |
|     2    |       3       |    |       3       | foobar        |
+----------+---------------+    +---------------+---------------+
Run Code Online (Sandbox Code Playgroud)

(为简洁usergroup排除,但他们的模型并不罕见)

无论如何,我的框架handler_key通过处理程序/路径表 URI路由到适当的(以解耦文件系统体系结构)然后将请求分派给处理程序,因为group_id与请求关联的请求是白名单的handler_key.

我很好奇,实现存储/检查任意( …

php permissions model-view-controller acl constraints

8
推荐指数
1
解决办法
973
查看次数

NetBeans自动完成和PHP; 强制__get()类型

NetBeans 7.0上的快速版本和PHP的自动完成功能;

我试图弄清楚(如果可能的话)如何__get()在类中强制实现返回(引用)某种类型,类型__get()是实现的同一类,总是如此.

现在,我有(View):

/**
 * @param string $key
 * @return View
 */
public function __get($key){
    return $this->getView($key);
}
Run Code Online (Sandbox Code Playgroud)

像这样访问:

$view->foo-> // should populate with methods from View
            ^
Run Code Online (Sandbox Code Playgroud)

现在我一直在阅读@property,但我不确定这对我正在做的事情是否正确.另一件事是(如果可能的话,这将是一个很好的功能)通常是嵌套的视图,所以在我的实现中看到这个并不罕见:

$view->foo->bar->baz-> // should populate with methods from View
                      ^
Run Code Online (Sandbox Code Playgroud)

关于如何强迫这个,或者我被卡住的任何想法?


更新:

因此@property似乎正朝着正确的方向前进,但似乎没有支持通配名称.那么为了详细说明我的问题,有没有人知道任何NetBeans插件,或者没有文档(或者只是很难找到)PHPDoc语法来支持通配符@property名称?

我正在考虑以下其中一个方向:

/**
 * @property View *
 * @property View ...
 * @property View $var,...
 */
Run Code Online (Sandbox Code Playgroud)

当然,这些变化都不起作用,但最后看起来最符合逻辑,因为它们似乎支持可变参数函数参数列表的类似语法.

php methods netbeans autocomplete class

8
推荐指数
1
解决办法
1668
查看次数

替换DOA <di>标签

该DOA(或者更准确,死之前到达)XHTML2工作标准表示支持<di>标签.

[...]该术语及其定义可以在一个di要素中分组,以帮助澄清术语与其定义之间的关系.

为了澄清,此标记将用于在以下位置分组<dt><dd>标记<dl>:

<dl>
    <di>
        <dt>defenestrate</dt>
        <dd>throw through or out of the window; "XHTML2 was defenestrated"</dd>
        <dd>what I will do if web standards keep going they way they are</dd>
    </di>
</dl>
Run Code Online (Sandbox Code Playgroud)

无论如何,既然<di>是在窗外(),我想知道当前支持的标记模式是什么(如果有的话)可以被描述为语义和​​结构上的等价?我基本上接受了这<dl>不足以满足我的要求(就美学要求而言),所以我正在研究其他解决方案.

我的意图<di>主要是一个样式钩子1,因为我正在使用一个定义列表,并打算将术语/定义分组设计为单个项目.

为了便于访问,我将使用aria-*role属性来帮助定义关系,但我希望存在一些普遍接受的模拟结构<di>,我根本没有遇到过.

例如,我正在考虑以下内容:

<ul>
    <li>
        <dfn id="term-1">term</dfn>
        <p aria-labelledby="term-1">definition for term 1</p> …
Run Code Online (Sandbox Code Playgroud)

html tags definition semantic-markup xhtml2

8
推荐指数
1
解决办法
446
查看次数

在PHP中有多个paamayim nekudotayims,为什么不呢?

PHP 5.3.6中,我注意到以下内容不起作用:

class Foo{
    public static $class = 'Bar';
}

class Bar{
    public static function sayHello(){
        echo 'Hello World';
    }
}

Foo::$class::sayHello();
Run Code Online (Sandbox Code Playgroud)

发行unexpected T_PAAMAYIM_NEKUDOTAYIM.但是,使用临时变量会产生预期的结果:

$class = Foo::$class;
$class::sayHello(); // Hello World
Run Code Online (Sandbox Code Playgroud)

有没有人知道这是设计的,还是范围分辨算子如何被标记化的意外结果?任何更清洁的解决方法比后者,临时变量示例?

php static-methods scope-resolution dynamic-class

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