沈逸老师PHP魔鬼特训笔记(4)
上一课我们通过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
, 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)
沈逸老师PHP魔鬼特训笔记(4)的更多相关文章
- 沈逸老师PHP魔鬼特训笔记(10)
为了防止代码让我们混淆不清,大家看视频中的分离方法 1.新建了一个文件夹叫code (这代表是代码) 2.再新建一个文件夹叫page (这代表是页面) 代码该怎么写呢? 这里要记住口诀 1.index ...
- 沈逸老师PHP魔鬼特训笔记(9)--进化
回到第一课,我们学过PHP母体,了解过解析PHP程序.PHP其实内置了一个web服务器,专门给我们开发测试使用,那么接下来我们要完成的是:生成后创建一个web 服务,在浏览器中可以访问. PHP的母体 ...
- 沈逸老师PHP魔鬼特训笔记(8)
创建模板文件: 这节课老师带领我们开始创建TEMPLATE,按照老师教导的思路,我们希望这样一种代码写法:1.譬如我定义一个变量$name=‘’;2.然后呢我读取一个模板.3.再然后我在这个模板里 设 ...
- 沈逸老师PHP魔鬼特训笔记(7)--我叫什么名字
一.生成文件夹. mkdir():--新建目录 bool mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false ...
- 沈逸老师PHP魔鬼特训笔记(6)--巫术与骨架
PHP最牛逼的特性之一除了懒人函数,还有一些魔法函数. 首先我们来认识下__tostring,通过一个巫术方法,我们吧实例转化过后的类,直接当字符串输出.结合我们前面所做的功能,我们在类里面加上这个函 ...
- 沈逸老师PHP魔鬼特训笔记(5)
接上一节课,我们专门新建了一个godconfig类,设置了两个属性prj_name(项目名),prj_author(作者),然后我们获取标准输入(stdin)把结果保存在了类里面. 好吧,这节课的名字 ...
- 沈逸老师PHP魔鬼特训笔记(3)
一.由于上两节课我们把程序放到了/usr/local/bin里面.每次编辑需要sudo .这节课我们使用PHPSTORM来编辑代码,专门把它拷贝出来,然后放到一个叫做home/godpro的文件夹下. ...
- 沈逸老师PHP魔鬼特训笔记(1)
此课程个人开发环境可以考虑使用Ubuntu ,推荐sublime和PhpStorm作为开发环境.一.PHP的一大特性是:脚本语言.不要编译,写完就可以运行? 然而并不是....... PHP代码要想运 ...
- 沈逸老师PHP魔鬼特训笔记(2)
一.这一课会学习到几个懒人函数: 1.file_put_contents (PHP 5, PHP 7) file_put_contents — 将一个字符串写入文件 说明 int file_put_c ...
随机推荐
- Intellij IDEA 杂记
添加JUnit File > Settings > Plugins > Browse repositories > 搜索junit ,安装JunitGenerator V2 重 ...
- HDU 5778 abs (素数,暴力)
题意:给定一个数x,求正整数y≥2y\geq 2y≥2,使得满足以下条件: 1.y-x的绝对值最小 2.y的质因数分解式中每个质因数均恰好出现2次. 析:由于y质因数分解式中每个质因数均出现2次,那么 ...
- HDU 5705 Clock (精度控制,暴力)
题意:给定一个开始时间和一个角度,问你下一个时刻时针和分针形成这个角度是几点. 析:反正数量很小,就可以考虑暴力了,从第一秒开始暴力,直到那个角度即可,不会超时的,数目很少,不过要注意精度. 代码如下 ...
- InteractivePNG
在as3中很多时候需要只能选中png中可视区域,即透明区域“感觉可以穿透”.
- 如何在微博侧栏中加入自己的微博[js]
<div class="box"> <ul> <li> <object classid="clsid:D27CDB6E-AE6D ...
- IE6下z-index失效
一.匆匆带过的概念关于CSS中层级z-index的定义啊什么的不是本文的重点,不会花费过多篇幅详细讲述.这里就简单带过,z-index伴随着层的概念产生的.网页 中,层的概念与photoshop或是f ...
- Unity实现相似于安卓原生项目的点击安卓返回button回到前一页的功能
本章博主和大家一起讨论下Unity怎么实现类似安卓原生项目,点击安卓返回button实现返回到前一个页面的功能. 1.定义一个泛型用于响应安卓的返回button public static List& ...
- EasyUI-Tab 标签添加右键菜单
在网上看了很多demo 自己实现了一个效果如下 <!doctype html> <html> <head> <meta http-equiv="co ...
- cdoj 24 8球胜负(eight) 水题
8球胜负(eight) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/24 ...
- 关于C#中派生类调用基类构造函数的理解
(1)当基类中没有自己编写的构造函数时,派生类默认条用基类的构造函数 (2)当基类中有自己编写的构造函数时,要在基类中添加无参的构造函数 public class MyBaseClass { publ ...