认真学习php面向对象-2
前言
准备写一个认真学习php面向对象的系列,使用php来做网页,没有深入了解php的话,可能三板斧就够了,并不需要有多高深!如有错误,欢迎各位不吝赐教!进度安排的话,我学到哪里,就更新到哪里了!形式的话就采用一个需求小案例,然后实现,并附上自己的总结,文章源码
所用到的环境
系统:ubuntu16.04
编辑器:phpstorm2017
需求 :1)参数容错以及自动化调用方法
解决 : __callstatic的使用以及构造调用函数
- __callstatic在调用一个类不存在的静态函数的时候会触发这个函数的执行,我们可以使用这个对输入一个不存在的参数的时候进行友好报错处理。
- 自动化调用,参数不多的时候,我们可以在类中指定函数名,但是当函数过多的时候,这种调用明显很费力,我们可以采取构造函数名的方法,对函数进行调用
实现 :
自动化调用
god.hp
require ("god_calss.php");
$result='';
if ($argc>=2) {
$p=$argv[1];
if(substr($p,0,1)=='-') {
$p=substr($argv[1],1);
$result=god_calss::$p();
} else {
$result="you shuold add - to call the function!";
}
// '-v'==$argv[1] && $result =god_calss::version();
// '-init'==$argv[1] && god_calss::init();
// '-make'==$argv[1] && god_calss::make();
}
echo $result;
echo PHP_EOL;
容错处理
god_class.hp
static function __callStatic($name, $arguments)
{
// TODO: Implement __callStatic() method.
echo "the function you call is undefined!";
}
效果 :
需求 :2)使用stdclass临时存储改造init
解决 : stdClass
- stdClass 在PHP内核进行模块初始化操作时会自动加载这个函数,它的所有的魔术方法,父类、接口等在初始化时都被设置成NULL。由于在PHP中对于一个类我们无法动态的添加方法, 所以这个类只能用来处理动态属性
实现 :
改造init
god_class.hp
static function init() {
echo "input your project_name?".PHP_EOL;
$prj_name=fgets(STDIN);
echo "input your author_name?".PHP_EOL;
$author=fgets(STDIN);
echo "your input:".PHP_EOL;
echo json_encode(TC(array('prj_name'=>$prj_name,'author'=>$author)));
}
####god_func.hp
//返回一个存储用户输入的对象
function TC($p) {
$get_class=new stdClass();
foreach ($p as $k=>$v) {
$get_class->$k=$v;
}
return $get_class;
}
god.hp
一定要再class文件前面
require (“god_func.php”);
require (“god_calss.php”);
效果 :
需求 :3)接受用户输入的参数创建文件夹
解决 : mkdir和file_get_contents和json_decode
具体用法可以查下官网手册
1. 前面我们接受用户输入,并将其存入json文件当中,现在要做的是从json文件读取数据,返回对象,创建用户输入对应的文件夹
实现 :
改造init
god_class.hp
static function start() {
$config=loadconfig();
//创建文件夹
!file_exists(getcwd().'/'.$config->prj_name) && mkdir(getcwd().'/'.$config->prj_name);
//创建文件
!file_exists(getcwd().'/'.$config->prj_name.'/index.php') && file_put_contents(getcwd().'/'.$config->prj_name.'/index.php','');
}
####god_func.hp
function loadconfig(){
$file=file_get_contents(getcwd().'/god.json');
return json_decode($file);
}
效果 :
需求 :4)自动引入用户需要调用的类文件
解决 : __autoload和命名空间namespace的使用
将上述创建文件自定义了一个类,为了更有规划的搭建整个项目的框架,项目文件目录变成这样子,core代表项目的核心文件目录,frame就是我们所引用的外部类库文件目录,template就是模板文件目录
实现 :
改造init
god_class.hp
在类名外面写入如下代码
use core\frame\god_frame;
function __autoload($className) {
$className=str_replace('\\','/',$className).'.php';
require($className);
}
方法调用:
static function start() {
$config=loadconfig();
$ff=new god_frame($config->prj_name);
$ff->run();
}
####god_frame.hp
namespace core\frame;
class god_frame
{
public $project_folder="";//项目入口文件
public $project_main="";//入口文件
function __construct($prjName)
{
$this->project_folder=getcwd()."/".$prjName;
$this->project_main=$this->project_folder.'/index.php';
}
function run() {
!file_exists($this->project_folder) && mkdir($this->project_folder);
!file_exists($this->project_main) && file_put_contents($this->project_main,'');
}
}