小编Joe*_*ins的帖子

为什么方法重命名在PHP特征中不起作用?

我使用PHP 7.1.0.

假设我们有一个特征,我们在一个类中使用它并重命名导入的方法:

trait T
{
    public function A() {
        echo ".";
    }
}

class C
{
    use T {
        A as B;
    }
}

$c = new C();
$c->B();
$c->A(); // Why does it work?
Run Code Online (Sandbox Code Playgroud)

为什么PHP仍然允许我使用旧的方法名称(A在这种情况下)?

这真的很痛苦,因为在更复杂的示例中,您不能依赖于方法重命名 - 因此您可能会意外地收到"不兼容的声明"错误:

class BaseSrc
{
}

trait BaseTrait
{
    public function init(BaseSrc $baseSrc)
    {
        echo "Init Base";
    }
}

class Base
{
    use BaseTrait {
        BaseTrait::init as initBase;
    }
}

$base = new Base();
$base->initBase(new BaseSrc());
$base->init(new BaseSrc()); // WHY …
Run Code Online (Sandbox Code Playgroud)

php traits

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

调用未定义的函数pcntl_fork()php-fpm nginx

我试图pcntl_fork()在php-fpm中使用,但它不可用,我得到:

Call to undefined function pcntl_fork()
Run Code Online (Sandbox Code Playgroud)

即使我已经在评论disable_functions中表达了评论php.ini.phpinfo()显示作者和php -m列表pcntl.如果我正在从cli执行我的脚本,它可以工作.我还需要启用其他选项吗?

作为MWE,我在https://github.com/white-gecko/pcntl-mwe resp上准备了一个最小的docker环境.

docker pull whitegecko/pcntl-mwe
Run Code Online (Sandbox Code Playgroud)

如果你用它运行它将docker run -it --rm --name pcntl -p 8080:80 pcntl有例子http://localhost:8080/和phpinfo at http://localhost:8080/phpinfo.php.它是一个debian jessie系统.

php pcntl

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

如何在php中跨线程共享全局变量?

在多线程中,全局变量或资源在线程之间共享.我在c中使用pthread库

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void *worker(void *);

int ctr = 0;
pthread_mutex_t lock;

int main(int argc, char *argv[])
{
  pthread_t t[2];
  int i = 0;

//~ pthread_mutex_init(&lock, NULL);

  while(i < 2)
  {
     pthread_create(&t[i], NULL, &worker, NULL);
     i++;
  }

  pthread_join(t[0], NULL);
  pthread_join(t[1], NULL);

//~ pthread_mutex_destroy(&lock);
//~ pthread_join(t[1], NULL);
  return 0;
}

void *worker(void *arg)
{
//~ pthread_mutex_lock(&lock);
//~ int ctr = 0;
    ctr += 1;

    printf("job %d started\n", ctr);
    sleep(1);
//~ ctr += 1;
    printf("job %d finished\n", ctr); …
Run Code Online (Sandbox Code Playgroud)

php multithreading pthreads

4
推荐指数
1
解决办法
3361
查看次数

使用除 xdebug 之外的其他代码覆盖率驱动程序

我想使用pcov而不是xdebug来生成代码覆盖率。

我正在使用 Docker 并且安装了 xdebug。

如果我运行以下命令,我可以确定 xdebug 不会影响测试执行吗?

php -d xdebug.default_enable=0 -d pcov.enabled=1 path/to/phpunit --coverage-text
Run Code Online (Sandbox Code Playgroud)

我读到pcov 可能更快,但据我所知 xdebug 必须被禁用。

是否最好执行以下操作来实现最快的覆盖率而不是运行上述命令?

  1. 删除/截断 xdebug 配置
  2. 运行测试

    php -d pcov.enabled=1 path/to/phpunit --coverage-text
    
    Run Code Online (Sandbox Code Playgroud)
  3. 恢复 xdebug 配置

phpunit xdebug pcov

4
推荐指数
1
解决办法
878
查看次数

为什么PHP中的ctype_space对于某些数值会返回"true"?

我最近ctype_*在PHP中使用了一组函数,发现了奇怪的行为.例如,我有一些代码:

    for ( $i = 0; $i < 1000000; $i++ ) {
        if ( ctype_space( $i ) ) {
            var_dump( $i );
        }
    }
Run Code Online (Sandbox Code Playgroud)

$i具有值[9,10,11,12,13,32]然后[ctype_space][1]将返回.我正在使用下一个PHP版本:

   PHP 7.1.4-1+deb.sury.org~xenial+1 (cli) (built: Apr 11 2017 22:12:32) ( NTS )
   Copyright (c) 1997-2017 The PHP Group
   Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
      with Zend OPcache v7.1.4-1+deb.sury.org~xenial+1, Copyright (c) 1999-2017, by Zend Technologies
      with Xdebug v2.5.1, Copyright (c) 2002-2017, by Derick Rethans
Run Code Online (Sandbox Code Playgroud)

这是PHP的错误还是功能?也许我不知道什么?请帮我理解一下.

php

3
推荐指数
1
解决办法
83
查看次数

标签 统计

php ×4

multithreading ×1

pcntl ×1

pcov ×1

phpunit ×1

pthreads ×1

traits ×1

xdebug ×1