PHP7扩展开发(四):拷贝与引用


引用计数

迄今为止,我们向HashTables中加入的zval要么是新建的,要么是刚拷贝的。它们都是独立的,只占用自己的资源且只存在于某个HashTable中。作为一个语言设计的概念,创建和拷贝变量的方法是“很好”的,但是习惯了C程序设计就会知道,通过避免拷贝大块的数据(除非绝对必须)来节约内存和CPU时间并不少见。考虑这段用户代码:

<?php
$a = file_get_contents('fourMegabyteLogFile.log');
$b = $a;
unset($a);


PHP7扩展开发(二):配置项与全局数值


起步

Zend引擎提供了另种管理设置值(INI)的途径。现在弄个简单的,我们经常看到php.ini里有诸如 display_errors = On 这样的全局设置。假设我们需要为我们扩展定义一个值: hello.greeting 并用函数 hello_ini() 返回它的内容。

在php.ini:

[hello]
hello.greeting=1

为了避免命名空间的冲突,我们扩展的名字作为所有值的前缀。仅仅是一种约定,一个句点用来分隔扩展名和说明性的初始设定名字。


Android模拟触控解决方案


数据采集

Android端

重写onTouchEvent,收集event数据,以一定的编码传输

public boolean onTouchEvent(MotionEvent event){
    String rec="";
    int pointerCount = event.getPointerCount();
    if (pointerCount > MAX_TOUCHPOINTS) {
        pointerCount = MAX_TOUCHPOINTS;
    }
    int opt=event.getAction();
    boolean isFirst=true;
    if(opt==2){
        for (int i = 0; i < pointerCount; i++) {
            int id = event.getPointerId(i);
            int x = (int) event.getX(i);
            int y = (int) event.getY(i);
            if(isFirst){isFirst=false;}
            else rec+=";";
            rec+=id+",2,"+x+","+y;
        }
    }else if(opt==0||(opt-5)%256==0){
        //为了简化,我们假设这过程不会进行MOVE
        int ind=(event.getAction()-5)/256;
        for (int i = 0; i < pointerCount; i++) {
            if(i==ind){
                int id = event.getPointerId(i);
                int x = (int) event.getX(i);
                int y = (int) event.getY(i);
                if(isFirst){isFirst=false;}
                else rec+=";";
                rec+=id+",0,"+x+","+y;
                break;
            }
        }
    }else if(opt==1||(opt-6)%256==0){
        int ind=(event.getAction()-6)/256;
        for (int i = 0; i < pointerCount; i++) {
            if(i==ind){
                int id = event.getPointerId(i);
                if(isFirst){isFirst=false;}
                else rec+=";";
                rec+=id+",1";
                break;
            }
        }
    }
    return true;
}