沈逸老师PHP魔鬼特训笔记(4)

时间:2023-03-10 07:21:05
沈逸老师PHP魔鬼特训笔记(4)

上一课我们通过shell脚本拷贝代码,了解了静态方法和静态属性。(还有个附件PHAR包,我直接无视了)

然后在GOD文件中写了一些参数,

沈逸老师PHP魔鬼特训笔记(4)

  我们也可以这样,把方法名像拼凑字符串一样拼起来。

 $get_param=$argv[1];
godinit::$get_param();

  好,下面我们还是按照老师课程,进行需求实现:如果参数带“-”,那么说明就是属性。直接调用类的静态属性。如果不带“-”,那么说明是方法,我们直接调用类的静态方法。

  于是,我先把上节课写过的god文件改成下面这样:

#!/usr/local/bin/php
<?php require('god_func7');
require("godinit.php"); $result='';
if($argc>=2)
{
/*'-v'==$argv[1] && $result=godinit::$V;
'make'==$argv[1] && $result=godinit::make();
'init'==$argv[1] && $result=godinit::init();*/
$p = $argv[1]; //获取参数
if(substr($p,0,1)=='-') // 代表获取并匹配变量,
{
//如果传过来的是-v,就会变成v
$p = substr($p,1);
$result = godinit::$$p;
}else{
$result = godinit::$p();
}
}
echo $result;
echo PHP_EOL;
?>

  结果如下图:

  沈逸老师PHP魔鬼特训笔记(4)

  沈逸老师PHP魔鬼特训笔记(4)

  我们回到上面的命令行,如果随便输出一个非-v的字符,就会出现错误,所以我们还需要把代码完善下。 

$p = $argv[1];  //获取参数
if(substr($p,0,1)=='-') // 代表获取并匹配变量,
{
//如果传过来的是-v,就会变成v
$p = substr($p,1);
$result =isset(godinit::$$p)?godinit::$p:error;
}else{
$result = godinit::$p();
}  

  这里我们将要用到一个PHP魔法函数 __callStatic($m,$args) 。这个方法如果你要用,必须写到类里面,且必须是static。它的作用是,如果你调用了一个未定义的静态方法,则会自动触发这个函数。 第一个参数是 方法名,第二个参数是方法参数。我们可以用它来做一个容错处理(只要学到这个地步),在godinit文件中,我们加入这个方法:

static function __callStatic($p1,$p2){
echo '$p1';
}

  然后,我们看看结果:

  沈逸老师PHP魔鬼特训笔记(4)

  现在再来看一般类定义和实例化以及调用,在我们新建一个godconfig文件,创建一个只有属性的godconfig类

<?php
class godconfig
{
public $prj_name;
public $prj_author; }
?>

  在godinit里的实例化类godconfig,使用 1、json_encode(实例化过后的类):返回一个json格式的字符串 2、json_decode(json字符串) : 返回一个对象。

<?php

require('godconfig.php');                //引入gonconfig这个文件
class godinit //创建一个类,godinit
{
static $v="god version is 1.2"; //声明一个静态属性$VERSION static function init() //静态方法 init
{
$gc = new godconfig(); //实例化godconfig里定义的类
echo "input your project name?".PHP_EOL;
$gc -> prj_name = fgets(STDIN); //从标准输入中获取用户输入的字符并赋值给实例化属性$prj_name echo "input your author name?".PHP_EOL;
$gc -> prj_author=fgets(STDIN); $ret = array(); //初始化一个数组;
$ret[] = $gc;
echo json_encode($ret);
//return ""
}
static function __callStatic($p1,$p2){
echo "error function";
}
}
?>

  然后我们看结果:

  沈逸老师PHP魔鬼特训笔记(4)

恶补几个简单的知识点(参考php.net手册):

1、三元条件运算符  $first ? $second : $third

  如果第一个子表达式的值是 TRUE(非零),那么计算第二个子表达式的值,其值即为整个表达式的值。否则,将是第三个子表达式的值。具体实例就不举了,请自行查看手册。

2、substr();

  string substr ( string $string , int $start [, int $length ] )  返回字符串 stringstartlength 参数指定的子字符串。   

  参数:string  输入字符串。必须至少有一个字符。

     start

      如果 start 是非负数,返回的字符串将从 stringstart 位置开始,从 0 开始计算。例如,在字符串 “abcdef” 中,在位置 0 的字符是 “a”,位置 2 的字符串是 “c” 等等。

      如果 start 是负数,返回的字符串将从 string 结尾处向前数第 start 个字符开始。

      如果 string 的长度小于 start,将返回 FALSE

      length

     如果提供了正数的 length,返回的字符串将从 start 处开始最多包括 length 个字符(取决于 string 的长度)。

     如果提供了负数的 length,那么 string 末尾处的许多字符将会被漏掉(若 start 是负数则从字符串尾部算起)。如果 start 不在这段文本中,那么将返回一个空字符串。

     如果提供了值为 0FALSENULLlength,那么将返回一个空字符串。

     如果没有提供 length,返回的子字符串将从 start 位置开始直到字符串结尾。

3、isset();

  bool isset ( mixed $var [, mixed $... ] )  检测变量是否设置,并且不是 NULL

  如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节("\0")并不等同于 PHP 的 NULL 常数。

  返回值:如果 var 存在并且值不是 NULL 则返回 TRUE,否则返回 FALSE

4、__callStatic($m,$args) 

  方法重载:public mixed __call ( string $name , array $arguments )  在对象中调用一个不可访问方法时,__call() 会被调用。

       public static mixed __callStatic ( string $name , array $arguments )  用静态方式中调用一个不可访问方法时,__callStatic() 会被调用。

  $name 参数是要调用的方法名称。$arguments 参数是一个枚举数组,包含着要传递给方法 $name 的参数。

<?php    //例子
class MethodTest
{
public function __call($name, $arguments)
{
// 注意: $name 的值区分大小写
echo "Calling object method '$name' "
. implode(', ', $arguments). "\n";
} /** PHP 5.3.0之后版本 */
public static function __callStatic($name, $arguments)
{
// 注意: $name 的值区分大小写
echo "Calling static method '$name' "
. implode(', ', $arguments). "\n";
}
} $obj = new MethodTest;
$obj->runTest('in object context'); MethodTest::runTest('in static context'); // PHP 5.3.0之后版本
?> 

5、json_encode()

  string json_encode ( mixed $value [, int $options = 0 [, int $depth = 512 ]] ),返回 value 值的 JSON 形式 。该方法对变量进行 JSON 编码。

   参数:value:  

      待编码的 value ,除了resource 类型之外,可以为任何数据类型。该函数只能接受 UTF-8 编码的数据

      depth:

      设置最大深度。 必须大于0。

         返回值:成功则返回 JSON 编码的 string 或者在失败时返回 FALSE

//json_encode()简单实例
<?php
$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
echo json_encode($arr);
?>
//返回结果:{"a":1,"b":2,"c":3,"d":4,"e":5}

版权声明:笔记整理者亡命小卒热爱*,崇尚分享。但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的《 PHP魔鬼训练课第一阶段》。本学习笔记小卒于博客园首发, 如需转载请尊重老师劳动,保留沈逸老师署名以及课程来源地址。

上一课:沈逸老师PHP魔鬼特训笔记(3

下一课:沈逸老师PHP魔鬼特训笔记(5)