沈逸老师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 ...
随机推荐
- JSON如何序列图片
图片采用JSON格式传输的话,需要把图片转成Base64格式. 首先把图片转成流:Image1.Picture.Graphic.SaveToStream(ss);然后编码成base64格式的:Enco ...
- CCF 201312-3 最大的矩形 (暴力,离散化)
问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi.这n个矩形构成了一个直方图.例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3 ...
- 建立ODBC数据源(基于windows)
1. win+r 2. control 3. 打开数据源 4. 点击添加 5. 选择Oracle in OraClient11g_home1 ,点击完成 6. 填写,查看具体参数信息点击Help 7. ...
- (博弈论)hdoj 1525 Euclid's Game
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1525 题目大意:Stan和Ollie在玩一个游戏,a和b两个数字,每次可以选择较大的数减去较小的数的若 ...
- ios实用wifi分析仪——AirPort
AirPort(wifi分析仪) android系统上免费的wifi分析仪很多,但是当我在AppStore上搜索时,找了半天也没找到想要的,后来还是问前辈才知道一款非常好用的app——AirPort, ...
- 如何解除Windows XP的IIS连接数限制
方法一: 开始 - 设置 - 控制面板 - 管理工具 - Internet 信息服务 - 默认网站 - 右键属性,把“网站”选项卡中“连接超时”下的复选框"保持HTTP连接"前的勾 ...
- Session的实现与存储
[集群中session安全和同步] 使用数据库来保存session,就算服务器宕机了也没事,session照样在. 每次请求都进行数据库读写开销不小(使用内存数据库可以提高性能,宕机就会丢失数据. ...
- easyui combobox筛选(拼音)
1.combobox本身的筛选 $('#cc').combobox({ filter: function(q, row){ var opts = $(this).combobox('options') ...
- jquery表单内容过滤
效果: 输入筛选字段后显示效果: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http ...
- FlashPaper 使用经验之谈
李志海 20101229 QQ:76855049 CSDN:资源下载地址:http://lizhihai_99.download.csdn.net/ http://download.csdn.ne ...