您的位置:首页 > 编程语言 > PHP开发

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

2016-08-29 16:59 176 查看
上一课我们通过shell脚本拷贝代码,了解了静态方法和静态属性。(还有个附件PHAR包,我直接无视了)

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



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

$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;
?>


  结果如下图:

  


  


  我们回到上面的命令行,如果随便输出一个非-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';
}


  然后,我们看看结果:

  


  现在再来看一般类定义和实例化以及调用,在我们新建一个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.net手册):

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


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

2、substr();

  string substr ( string
$string
, int
$start
[, int
$length
] )  返回字符串
string
start
length
参数指定的子字符串。
  参数:
string  
输入字符串。必须至少有一个字符。

     start


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

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

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


      
length


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

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

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

     如果没有提供
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: