php CALL_USER_FUNC与实例化的区别

 更新时间:2016年11月25日 16:45  点击:2128
CALL_USER_FUNC函数可以调用或执行函数了,第一次看到CALL_USER_FUNC函数使用在dz论坛的二次开发中了,下面我们一起来看看CALL_USER_FUNC用法。


使用call_user_func函数,通过传入字符串函数,可以调用自定义函数,并且支持引用。

1.mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )

调用第一个参数提供的自定义函数,后面的参数为自定义函数的参数,返回自定义函数的结果


function say($word)
{
    echo $word;
}
call_user_func('say', 'hello world'); //hello world


使用call_user_func可以执行一个类的某个方法,而且可以给方法传参数,它跟实例化一个类再调用方法有什么区别呢?看下面的例子。

class A
{
    public function __Construct($a,$b,$c)
    {
        echo 'Construct'.$a.$b.$c;
    }
 
    public function test($a,$b,$c)
    {
        echo ' test'.$a.$b.$c;
    }
}
 
$a = new A(1,2,3);
$a->test(1,2,3);
 
call_user_func(['A','test'],1,2,3);

类A有一个构造方法,如果用实例化的方式new A,会执行构造函数,而使用call_user_func的方式调用test方法,并没有出发构造函数,虽然都可以执行到方法,这就是两者的区别。

那么在有的情况下,并不能直接实例化一个类,希望通过其他方式去得到一个类,而且能够执行类的构造方法怎么办?

此时可以使用类的反射类和newInstanceArgs来创建一个新的类的实例,代码如下:

 

$reflection = new ReflectionClass('A');
$newclass = $reflection->newInstanceArgs([1,2,3]);
$newclass->test(1,2,3);

它的效果等同于:


$a = new A(1,2,3);
$a->test(1,2,3);

具体可以参见

首先定义一个类A,用ReflectionClass得到A的反射类对象,通过ReflectionClass对象可以得到类的各种属性,包括命名空间,父类,类名等,使用newInstanceArgs可以传入构造函数的参数创建一个新的类的实例。

class A
{
    public $name;
 
    public function __Construct($name,$des)
    {
        $this->name = $name.','.$des;
    }
    public function aa()
    {
        echo $this->name;
    }
}
 
$class = new ReflectionClass('A');
 
$aaa = $class->newInstanceArgs(['www.111cn.net','blog']);
 
$aaa->aa();

输出结果:www.111cn.net,blog

以上示例中的$aaa即是通过newInstanceArgs创建的一个新的A类的实例,因此它可以调用A类的方法aa(),值得注意的是newInstanceArgs创建新类必须传参,也就是要求这个类要有构造方法。

array_multisort() 函数对多个数组或多维数组进行排序。参数中的数组被当成一个表的列并以行来进行排序 - 这类似 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话,就会按照下一个输入数组中相应值的大小进行排序,依此类推。

一、先看最简单的情况。

有两个数组:

$arr1 = array(1, 9, 5);
$arr2 = array(6, 2, 4);

array_multisort($arr1, $arr2);

print_r($arr1); // 得到的顺序是1,5,9
print_r($arr2); // 得到的顺序是6,4,2

我估计两个数组的值自始至终都是对应着的:1对应6,9对应2,5对应4。我们再加多一个数组看看会怎样:

$arr1 = array(1, 9, 5);
$arr2 = array(6, 2, 4);
$arr3 = array(3, 7, 8);

array_multisort($arr1, $arr2, $arr3);

查看结果,1自始至终都对应6对应3,其它项也是如此。这种对应关系就是手册中所谓的“排序时保留原有的键名关联”。

另外,也可以把每个数组想像成数据库表的一列。而对应着的1, 6, 3为一数据行,9, 2, 7为另一数据行,5, 4, 8 另一行。

array_multisort会先按第一个数组(想像成列)排序,如果第一个数组(列)的值相同,则按第二个数组(列)排序。

具体可以用下面的程式来测试:

$arr1 = array(1, 9, 5, 9);
$arr2 = array(6, 2, 4, 1);
$arr3 = array(3, 7, 8, 0);

array_multisort($arr1, $arr2, $arr3);

可以想像这里$arr3的结果是(3, 8, 0, 7)。

二、接下来讲解array_multisort的参数。

这个函数的参数很灵活。最简单的情况是如上面所示的以1个或n个数组作为参数,需要注意的是每个数组的项数要一样,否则会warning导致排序失效。

像这样array_multisort($arr1, $arr2, $arr3); 默认是所有数组都是升序排列,如果想对$arr2降序,并当作字符串去比较,就要写成:

    array_multisort($arr1, $arr2, SORT_DESC, SORT_STRING, $arr3);

每个array后面可以跟一个排序顺序标志或一个排序类型标志,或者两种标志同时出现。但是每种排序标志在每个数组后面只能出现一个。

详细如下:

排序顺序标志:

    SORT_ASC - 按照上升顺序排序(默认)
    SORT_DESC - 按照下降顺序排序

排序类型标志:

    SORT_REGULAR - 将项目按照通常方法比较(默认)
    SORT_NUMERIC - 将项目按照数值比较
    SORT_STRING - 将项目按照字符串比较

 

三、最后是array_multisort有什么实际作用。

我们通常有一些多维数组需要排序:

$guys = array(
    array(
        'name' => 'jake',
        'score' => 80,
        'grade' => 'A'
    ),
    array(
        'name' => 'jin',
        'score' => 70,
        'grade' => 'A'
    ),
    array(
        'name' => 'john',
        'score' => 80,
        'grade' => 'A'
    ),
    array(
        'name' => 'ben',
        'score' => 20,
        'grade' => 'B'
    )
);

例如我们想按成绩倒序排列,如果成绩相同就按名字的升序排列。

这时我们就需要根据$guys的顺序多弄两个数组出来:

$scores = array(80, 70, 80, 20);
$names = array('jake', 'jin', 'john', 'ben');

然后

array_multisort($scores, SORT_DESC, $names, $guys);

就行了。

还能不能更灵活一点呢,每次想排序都要另外弄些数组出来吗?

其实可以经封装几个函数:

<?php
/**
 * 根据指定的键对数组排序
 *
 * 用法:
 * <code>
 * $rows = array(
        array('id' => 1, 'value' => '1-1', 'parent' => 1),
        array('id' => 2, 'value' => '2-1', 'parent' => 1),
        array('id' => 3, 'value' => '3-1', 'parent' => 1),
        array('id' => 4, 'value' => '4-1', 'parent' => 2),
        array('id' => 5, 'value' => '5-1', 'parent' => 2),
        array('id' => 6, 'value' => '6-1', 'parent' => 3),
    );
 *
 * $rows = list_sortByCol($rows, 'id', SORT_DESC);
 * dump($rows);
 * // 输出结果为:
 * // array(
 * // array('id' => 6, 'value' => '6-1', 'parent' => 3),
 * // array('id' => 5, 'value' => '5-1', 'parent' => 2),
 * // array('id' => 4, 'value' => '4-1', 'parent' => 2),
 * // array('id' => 3, 'value' => '3-1', 'parent' => 1),
 * // array('id' => 2, 'value' => '2-1', 'parent' => 1),
 * // array('id' => 1, 'value' => '1-1', 'parent' => 1),
 * // )
 * </code>
 *
 * @param array $array 要排序的数组
 * @param string $keyname 排序的键
 * @param int $dir 排序方向
 * @return array 排序后的数组
*/
function list_sortByCol($array, $keyname, $dir = SORT_ASC)
{
    return list_sortByMultiCols($array, array($keyname => $dir));
}

/**
* 将一个二维数组按照多个列进行排序,类似 SQL 语句中的 ORDER BY
*
* 用法:
* <code>
* $rows = list_sortByMultiCols($rows, array(
    'parent' => SORT_ASC,
    'name' => SORT_DESC,
* ));
* </code>
*
* @param array $rowset 要排序的数组/行集
* @param array $args 排序的键
*
* @return array 排序后的数组
*/
function list_sortByMultiCols($rowset, $args)
{
    $sortArray = array();
    $sortRule = '';

    foreach ($args as $sortField => $sortDir)
    {
        foreach ($rowset as $offset => $row)
        {
            $sortArray[$sortField][$offset] = $row[$sortField];
        }
        $sortRule .= '$sortArray[\'' . $sortField . '\'], ' . $sortDir . ', ';
    }

    if (empty($sortArray) || empty($sortRule))
    {
        return $rowset;
    }
    eval('array_multisort(' . $sortRule . '$rowset);');

    return $rowset;
}



PHP二维数组排序(sort_array)

/**
 * 对二维数组进行排序
 * 模拟 数据表记录按字段排序
 *
 * <code>
 *  @list_sort($list, $get['orderKey'], $get['orderType']);
 * </code>
 * @param array $array 要排序的数组
 * @param string $orderKey 排序关键字/字段
 * @param string $orderType 排序方式,'asc':升序,'desc':降序
 * @param string $orderValueType 排序字段值类型,'number':数字,'string':字符串
 */
function list_sort(&$array, $orderKey, $orderType = 'asc', $orderValueType = 'string')
{
    if (is_array($array))
    {
        $orderArr = array();
        foreach ($array as $val)
        {
            $orderArr[] = $val[$orderKey];
        }
        $orderType = ($orderType == 'asc') ? SORT_ASC : SORT_DESC;
        $orderValueType = ($orderValueType == 'string') ? SORT_STRING : SORT_NUMERIC;
        array_multisort($orderArr, $orderType, $orderValueType, $array);
    }
}

应用:

@sort_array($list, $get['sort'], $get['order'], "string");

IS_CALLABLE 函数用到比较少它的作用是检测参数是否为合法的可调用结构了,下文我们来看看这个函数的用法及返回的结果如何。


PHP的is_callable用于检测一个函数或者一个类的方法是否可执行,用官方文档的话说就是检测参数是否为合法的可调用结构,代码示例如下。

class A
{
    public function __construct(){
        echo 'Class:'.get_called_class();
    }
 
    public function cc(){
        $a = 3;
        return $a;
    }
}
 
$a = new A;
 
$test = is_callable(array('A','cc'));
var_dump($test);exit;
打印结果:
Class:A
boolean true

官方示例:

function someFunction() 

{

}

 

$functionVariable = 'someFunction';

 

var_dump(is_callable($functionVariable, false, $callable_name));  // bool(true)

 

echo $callable_name, "\n";  // someFunction

 

//

//  Array containing a method

//

 

class someClass {

 

  function someMethod() 

  {

  }

 

}

 

$anObject = new someClass();

 

$methodVariable = array($anObject, 'someMethod');

 

var_dump(is_callable($methodVariable, true, $callable_name));  //  bool(true)

 

echo $callable_name, "\n";  //  someClass::someMethod

官方示例分别是一个检测函数,和一个检测类的方法,以及更具体的用法。

例子

演示代码如下:

<?php

class test {

 static function a() {

  return "test";

 }

}

class abc {

 public function a($Object,$funcName){ 

  if (!is_callable(array($Object,$funcName))){//此处array($object,$funcname)的用法,相当于$object::$funcname调用$object的$funcname方法

   echo("Error");

  }else {

   echo("OK");

  }

 }

}

 

$abc=new abc();

$abc->a("test","aa");//test类下没有aa方法,会输出error

$abc->a("test","a");//test类下有a方法,会输出ok

?>

 

OK ,这个函数的用法

 

unset() 销毁指定的变量。注意在 PHP 3 中,unset() 将返回 TRUE(实际上是整型值 1),而在 PHP 4 中,unset() 不再是一个真正的函数:它现在是一个语句。这样就没有了返回值,试图获取 unset() 的返回值将导致解析错误。

 先来看unset函数语法

unset

删除变量。

语法: int unset(mixed var);

返回值: 整数

函数种类: PHP 系统功能

内容说明

本函数将变量删除,成功则返回 true 值。

首先让我们看一个例子

    var_dump(memory_get_usage());
    $a = "laruence";
    var_dump(memory_get_usage());
    unset($a);
    var_dump(memory_get_usage());

输出(在我的个人电脑上, 可能会因为系统,PHP版本,载入的扩展不同而不同):

    int(90440)
    int(90640)
    int(90472

注意到 90472-90440=32, 于是就有了各种的结论, 有的人说PHP的unset并不真正释放内存, 有的说, PHP的unset只是在释放大变量(大量字符串, 大数组)的时候才会真正free内存, 更有人说, 在PHP层面讨论内存是没有意义的.

那么, 到底unset会不会释放内存? 这32个字节跑哪里去了?

要回答这个问题, 我将从俩个方面入手:
这32个字节去哪里了

首先我们要打破一个思维: PHP不像C语言那样, 只有你显示的调用内存分配相关API才会有内存的分配.
也就是说, 在PHP中, 有很多我们看不到的内存分配过程.
比如对于:

    $a = "laruence";

隐式的内存分配点就有:

    1. 为变量名分配内存, 存入符号表
    2. 为变量值分配内

所以, 不能只看表象.
第二, 别怀疑,PHP的unset确实会释放内存(当然, 还要结合引用和计数, 这部分的内容请参看我之前的文章深入理解PHP原理之变量分离/引用), 但这个释放不是C编程意义上的释放, 不是交回给OS.
对于PHP来说, 它自身提供了一套和C语言对内存分配相似的内存管理API,这些API和C的API意义对应, 在PHP内部都是通过这些API来管理内存的.

当我们调用emalloc申请内存的时候, PHP并不是简单的向OS要内存, 而是会像OS要一个大块的内存, 然后把其中的一块分配给申请者, 这样当再有逻辑来申请内存的时候, 就不再需要向OS申请内存了, 避免了频繁的系统调用.

比如如下的例子:

    <?php
    var_dump(memory_get_usage(TRUE)); //注意获取的是real_size
    $a = "laruence";
    var_dump(memory_get_usage(TRUE));
    unset($a);
    var_dump(memory_get_usage(TRUE));

输出:

    int(262144)
    int(262144)
    int(262144

也就是我们在定义变量$a的时候, PHP并没有向系统申请新内存.

同 样的, 在我们调用efree释放内存的时候, PHP也不会把内存还给OS, 而会把这块内存, 归入自己维护的空闲内存列表. 而对于小块内存来说, 更可能的是, 把它放到内存缓存列表中去(后记, 某些版本的PHP, 比如我验证过的PHP5.2.4, 5.2.6, 5.2.8, 在调用get_memory_usage()的时候, 不会减去内存缓存列表中的可用内存块大小, 导致看起来, unset以后内存不变).

现在让我来回答这32个字节跑哪里去了, 就向我刚才说的, 很多内存分配的过程不是显式的, 看了下面的代码你就明白了:

    <?php
    var_dump("I am www.111cn.net");
    var_dump(memory_get_usage());
    $a = "laruence";
    var_dump(memory_get_usage());
    unset($a);
    var_dump(memory_get_usage());

输出:

    string(43) "I am www.111cn.net"
    int(90808) //赋值前
    int(90976)
    int(90808) //是的, 内存正常释放

90808-90808 = 0, 正常了, 也就是说这32个字节是被输出函数给占用了(严格来说, 是被输出的Header占用了)

 
只增不减的数组

Hashtable是PHP的核心结构(了解Hashtable, 可以参看我之前的文章深入理解PHP之数组(遍历顺序)), 数组也是用她来表示的, 而符号表也是一种关联数组, 对于如下代码:

    var_dump("I am www.111cn.net");
    var_dump(memory_get_usage());
    $array = array_fill(1, 100, "laruence");
    foreach ($array as $key => $value) {
        ${$value . $key} = NULL;
    }
    var_dump(memory_get_usage());
    foreach ($array as $key=> $value) {
        unset(${$value . $key});
    }
    var_dump(memory_get_usage());

我们定义了100个变量, 然后又按个Unset了他们, 来看看输出:

    string(43) "I am www.111cn.net"
    int(93560)
    int(118848)
    int(104448

Wow, 怎么少了这么多内存?
这是因为对于Hashtable来说, 定义它的时候, 不可能一次性分配足够多的内存块, 来保存未知个数的元素, 所以PHP会在初始化的时候, 只是分配一小部分内存块给HashTable, 当不够用的时候再RESIZE扩容,

而Hashtable, 只能扩容, 不会减少, 对于上面的例子, 当我们存入100个变量的时候, 符号表不够用了, 做了一次扩容, 而当我们依次unset掉这100个变量以后, 变量占用的内存是释放了(118848 – 104448), 但是符号表并没有缩小, 所以这些少的内存是被符号表本身占去了…

现在, 你是不是对PHP的内存管理有了一个初步的认识了呢?

如果还没明白再来看例子先看一个例子:

<?php 
$s=str_repeat('1',255);  //产生由255个1组成的字符串 
$m=memory_get_usage();  //获取当前占用内存 
unset($s); 
$mm=memory_get_usage();  //unset()后再查看当前占用内存 
echo $m-$mm; 
?> 

最后输出unset()之前占用内存减去unset()之后占用内存,如果是正数,那么说明unset($s)已经将$s从内存中销毁(或者说,unset()之后内存占用减少了),可是我在PHP5和windows平台下,得到的结果是:-48。这是否可以说明,unset($s)并没有起到销毁变量$s所占用内存的作用呢?我们再作下面的例子:

<?php 
$s=str_repeat('1',256);  //产生由256个1组成的字符串 
$m=memory_get_usage();  //获取当前占用内存 
unset($s); 
$mm=memory_get_usage();  //unset()后再查看当前占用内存 
echo $m-$mm; 
?> 

这个例子,和上面的例子几乎相同,唯一的不同是,$s由256个1组成,即比第一个例子多了一个1,得到结果是:224。这是否可以说明,unset($s)已经将$s所占用的内存销毁了?

通过上面两个例子,我们可以得出以下结论:结论一、unset()函数只能在变量值占用内存空间超过256字节时才会释放内存空间。

那么是不是只要变量值超过256,使用unset就可以释放内存空间呢?我们再通过一个例子来测试一下:

<?php 
$s=str_repeat('1',256);  //这和第二个例子完全相同 
$p=&$s; 
$m=memory_get_usage(); 
unset($s);  //销毁$s 
$mm=memory_get_usage(); 
echo $p.'<br />'; 
echo $m-$mm; 
?> 

刷新页面,我们看到第一行有256个1,第二行是-48,按理说我们已经销毁了$s,而$p只是引用$s的变量,应该是没有内容了,另外,unset($s)后内存占用却比unset()前增加了!现在我们再做以下的例子:

<?php 
$s=str_repeat('1',256);  //这和第二个例子完全相同 
$p=&$s; 
$m=memory_get_usage(); 
$s=null;  //设置$s为null 
$mm=memory_get_usage(); 
echo $p.'<br />'; 
echo $m-$mm; 
?>

 现在刷新页面,我们看到,输出$p已经是没有内容了,unset()前后内存占用量之差是224,即已经清除了变量占用的内存。本例中的$s=null也可以换成unset(),如下:

<?php 
$s=str_repeat('1',256);  //这和第二个例子完全相同 
$p=&$s; 
$m=memory_get_usage(); 
unset($s);  //销毁$s 
unset($p); 
$mm=memory_get_usage(); 
echo $p.'<br />'; 
echo $m-$mm; 
?> 

我们将$s和$p都使用unset()销毁,这时再看内存占用量之差也是224,说明这样也可以释放内存。那么,我们可以得到另外一条结论:结论二、只有当指向该变量的所有变量(如引用变量)都被销毁后,才会释放内存。

字符串长度在php中内置了strlen和mb_strlen函数了,它们基本可以满足我们的判断字符串长度的要求了,但是对于中文好像处理不够好了,但只要不计较字节长度就没有问题了,下面来理解一下。


在php中常见的计算字符串长度的函数有:strlen和mb_strlen

 

比较strlen和mb_strlen

 

1.strlen PHP内置的字符串长度函数
2.mb_strlen 不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保"extension=php_mbstring.dll"这一行存在并且没有被注释掉

当字符全是英文字符的时候,两者是一样的。关于中文的问题,PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在UTF-8编码下,一个汉字占3个字节)。

mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和strlen类似,只不过它有第二个可选参数用于指定字符编码。
例如得到UTF-8的字符串$str长度,可以用mb_strlen($str,'UTF-8')。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过mb_internal_encoding()函数得到

代码如下:

<?php

//编码方式UTF8

$str='php教程网';

echo strlen($str);

echo '<br />';

echo mb_strlen($str,'UTF8');

//输出结果

//12

//6

?>

 

strlen和mb_strlen的区别

 

在PHP中,strlen与mb_strlen是求字符串长度的函数,但是对于一些初学者来说,如果不看手册,也许不太清楚其中的区别。
下面通过例子,讲解这两者之间的区别。

先看例子:

<?php  

//测试时文件的编码方式要是UTF8  

$str='中文a字1符';  

echo strlen($str).'<br>';//14  

echo mb_strlen($str,'utf8').'<br>';//6  

echo mb_strlen($str,'gbk').'<br>';//8  

echo mb_strlen($str,'gb2312').'<br>';//10  

?>

 

结果分析:在strlen计算时,对待一个UTF8的中文字符是3个长度,所以“中文a字1符”长度是3*4+2=14,在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“中文a字1符”长度是6 .

利用这两个函数则可以联合计算出一个中英文混排的串的占位是多少(一个中文字符的占位是2,英文字符是1)

echo (strlen($str) + mb_strlen($str,'UTF8')) / 2;

 

例如 “中文a字1符” 的strlen($str)值是14,mb_strlen($str)值是6,则可以计算出“中文a字1符”的占位是10.

echo mb_internal_encoding();

PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得 到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在 UTF-8编码下,一个汉字占3个字节)。

 

采用mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和 strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串$str长度,可以用 mb_strlen($str,'UTF-8')。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过 mb_internal_encoding()函数得到。

 

需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

[!--infotagslink--]

相关文章

  • mysql_connect与mysql_pconnect的区别详解

    在mysql中我们会看到有两种常用的数据库连接模式,一种是长久连接,另一各是页面访问完之后就断了连接,下面我来分别介绍mysql_connect与mysql_pconnect的区别,有需要了解...2016-11-25
  • C#中out与ref的区别实例解析

    这篇文章主要介绍了C#中out与ref的区别实例解析,对C#初学者有不错的学习借鉴价值,需要的朋友可以参考下...2020-06-25
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • 谈谈Jquery中的children find 的区别有哪些

    精华:find方法能找子孙,children方法只能找儿子一、Jquery中children 语法.children(selector) 说明expr是表达式,可选参数,所有选择器中的表达式都可以用在这,比如按标签名"div",按类名".class",按序号":first"等等,如果表...2015-10-21
  • PS中像素大小、文档大小的区别

    在PS中像素大小、文档大小有什么区别呢,这个估计很多初学者不清楚,下面我来给大家讲解一下,希望对你有帮助。 1、像素大小 通常用于显示屏显示的图片大小的调整。菜...2016-09-14
  • 快速理解MySQL中主键与外键的实例教程

    主键与外键的关系,通俗点儿讲,我现在有一个论坛,有两张表,一张是主贴 thread,一张是回帖 reply先说说主键,主键是表里面唯一识别记录的字段,一般是帖子id,体现在访问的时候,例如是 thread.php&#63;id=1 表示我要访问的是帖子...2015-11-24
  • C#中sleep和wait的区别分析

    这篇文章主要介绍了C#中sleep和wait的区别分析,有助于深入理解C#中线程的原理与使用技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • c# 接口使用实例

    这篇文章主要介绍了c#接口使用的实例,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-17
  • yii添删改查实例

    一、数据访问对象 (DAO)YiiDAO 基于 PHP Data Objects (PDO) 构建。它是一个为众多流行的DBMS提供统一数据访问的扩展,这些 DBMS 包括MySQL, PostgreSQL 等等。因此,要使用 Yii DAO,PDO 扩展和特定的 PDO 数据库驱动(例如...2015-11-24
  • uniapp和vue的区别详解

    这篇文章主要介绍了uniapp和vue的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-10-19
  • input框中的name和id的区别

    这篇文章主要介绍了input框中的name和id的区别介绍,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-11-22
  • list与push的区别

    //函数list while(list($id,$username,$password,$add_date,$mdn,$mobile,$channel,$last_date,$area,$nickname) = mysql_fetch_array($rs)){ ...2016-11-25
  • php switch 与 if else 区别

    在php中switch是选择,if else也有同理,但是它们肯定是有区别的,那么我们来看看它们两者的区别在哪里呢,下面先看switch case语句吧。 switch($id){ case 1: ...2016-11-25
  • C#中的IEnumerable简介及简单实现实例

    这篇文章主要介绍了C#中的IEnumerable简介及简单实现实例,本文讲解了IEnumerable一些知识并给出了一个简单的实现,需要的朋友可以参考下...2020-06-25
  • 浅谈C++中字符串输入get与getline的区别

    这篇文章主要介绍了C++中字符串输入get与getline的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • php mysql localhost,127.0.0.1和ip区别

    一家之言:localhost与127.0.0.1的区别 localhost与127.0.0.1的区别是什么?相信有人会说是本地ip,曾有人说,用127.0.0.1比localhost好,可以减少一次解析。看来这个入门问题还有人不清楚,其实这两者是有区别的。no1:localhos...2014-05-31
  • C#中类与接口的区别个人总结

    这篇文章主要介绍了C#中类与接口的区别个人总结,本文讲解了类与接口的区别、接口的用处主要体现在下面几个方面、一些接口的疑问等内容,需要的朋友可以参考下...2020-06-25
  • include包含头文件的语句中,双引号和尖括号的区别(详解)

    下面小编就为大家带来一篇include包含头文件的语句中,双引号和尖括号的区别(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
  • 详解CSS3中nth-child与nth-of-type的区别

    这篇文章详细解析了CSS3中nth-child与nth-of-type的区别,有兴趣的同学可以参考一下 CSS3中nth-child与nth-of-type的区别其实很简单::nth-of-type为什么要叫:nth-of...2017-01-22
  • 英语单词state与status的区别

    state倾向于condition,是一种延续性的状态。status常用于描述一个过程中的某阶段(phase),类似于C语言中枚举型变量某一个固定的值,这个值属于一个已知的集合。这篇文章主要介绍了英语单词state与status的区别,需要的朋友可以参考下...2020-06-25