欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

php静态变量与方法与phar的使用

程序员文章站 2022-04-20 23:45:18
本节用类与静态变量改造之前的例子:php根据命令行参数生成配置文件 ghostinit.php: ghost: 执行结果: callstatic继续改造: ghostinit.php: ghost: 把配置独立成一个类 ghostconfig.php: 把这两个属性注释,也可以正常运行, php允许 ......

本节用类与静态变量改造之前的例子:php根据命令行参数生成配置文件

ghostinit.php:

<?php
    
    class ghostinit{
        static $version = 'ghost version is 1.1';
        static $projName = '';
        static $author = 'ghostwu';
        static function init(){
            echo "pls input project name?" . PHP_EOL;
            self::$projName = fgets( STDIN );

            echo "pls input author?" . PHP_EOL;
            self::$author = fgets( STDIN );
            
            echo "您输入的项目信息如下:" . PHP_EOL;
            echo self::$projName . PHP_EOL;
            echo self::$author . PHP_EOL;
        }    

        static function make(){
            $pchar=new Phar("ghost.phar");
            $pchar->buildFromDirectory(dirname(__FILE__));
            $pchar->setStub($pchar->createDefaultStub('ghost'));
            $pchar->compressFiles(Phar::GZ);        
        }
    }

?>

ghost:

#!/usr/bin/php
<?php
require "ghostinit.php";

$result = '';

if( $argc >= 2 ) {
    $argv[1] == '-v' && $result = ghostinit::$version;
    $argv[1] == 'make' && ghostinit::make();
    $argv[1] == 'init' && ghostinit::init();
}

echo $result . PHP_EOL;

执行结果:

ghostwu@dev:~/php/php1/3$ ls
done  ghost  ghostinit.php
ghostwu@dev:~/php/php1/3$ ./ghost init
pls input project name?
test
pls input author?
ghostwu
您输入的项目信息如下:
test

ghostwu


ghostwu@dev:~/php/php1/3$ ls
done  ghost  ghostinit.php
ghostwu@dev:~/php/php1/3$ ./ghost make

ghostwu@dev:~/php/php1/3$ ls
done  ghost  ghostinit.php  ghost.phar
ghostwu@dev:~/php/php1/3$ ./ghost -v
ghost version is 1.1
ghostwu@dev:~/php/php1/3$ 

 

callstatic继续改造:

ghostinit.php:

<?php
    
    class ghostinit{
        static $v = 'ghost version is 1.1';
        static $projName = '';
        static $author = 'ghostwu';
        static function init(){
            echo "pls input project name?" . PHP_EOL;
            self::$projName = fgets( STDIN );

            echo "pls input author?" . PHP_EOL;
            self::$author = fgets( STDIN );
            
            echo "您输入的项目信息如下:" . PHP_EOL;
            echo self::$projName . PHP_EOL;
            echo self::$author . PHP_EOL;
        }    

        static function make(){
            $pchar=new Phar("ghost.phar");
            $pchar->buildFromDirectory(dirname(__FILE__));
            $pchar->setStub($pchar->createDefaultStub('ghost'));
            $pchar->compressFiles(Phar::GZ);        
        }

        static function __callstatic( $m, $args ){
            echo 'error function';
        }

    }

?>

ghost:

#!/usr/bin/php
<?php
require "ghostinit.php";

$result = '';

if( $argc >= 2 ) {
    $p = $argv[1]; 
    if( substr( $p, 0, 1 ) == '-' ) {
        $p = substr( $p, 1 );
        $result = isset( ghostinit::$$p ) ? ghostinit::$$p : 'error';
    }else {
        $result = ghostinit::$p();
    }
}

echo $result . PHP_EOL;

 把配置独立成一个类

ghostconfig.php:   把这两个属性注释,也可以正常运行, php允许动态增加成员变量(类的属性)

<?php
class ghostconfig{
    public $projName;
    public $author;
    
}

ghostinit.php

<?php
    require( "ghostconfig.php" );    

    class ghostinit{
        static $v = 'ghost version is 1.1';

        static function init(){
            $conf = new ghostconfig();
            echo "pls input project name?" . PHP_EOL;
            $conf->projName = fgets( STDIN );

            echo "pls input author?" . PHP_EOL;
            $conf->author = fgets( STDIN );
            
            echo "您输入的项目信息如下:" . PHP_EOL;

            echo json_encode( $conf );
        }    

        static function make(){
            $pchar=new Phar("ghost.phar");
            $pchar->buildFromDirectory(dirname(__FILE__));
            $pchar->setStub($pchar->createDefaultStub('ghost'));
            $pchar->compressFiles(Phar::GZ);        
        }

        static function __callstatic( $m, $args ){
            echo 'error function';
        }

    }

?>

 利用*类stdClass代替config类,这样就减少了一个类,这个config类目前只用到了一次,完全可以用stdClass再次简化

<?php

    class ghostinit{
        static $v = 'ghost version is 1.1';

        static function init(){
            $conf = new stdClass();
            echo "pls input project name?" . PHP_EOL;
            $conf->projName = fgets( STDIN );

            echo "pls input author?" . PHP_EOL;
            $conf->author = fgets( STDIN );
            
            echo "您输入的项目信息如下:" . PHP_EOL;

            echo json_encode( $conf );
        }    

        static function make(){
            $pchar=new Phar("ghost.phar");
            $pchar->buildFromDirectory(dirname(__FILE__));
            $pchar->setStub($pchar->createDefaultStub('ghost'));
            $pchar->compressFiles(Phar::GZ);        
        }

        static function __callstatic( $m, $args ){
            echo 'error function';
        }

    }

?>

 生成配置信息,再次简化,变成公共模块:

static function init(){
            echo "pls input project name?" . PHP_EOL;
            $projName = fgets( STDIN );

            echo "pls input author?" . PHP_EOL;
            $author = fgets( STDIN );
            
            echo "您输入的项目信息如下:" . PHP_EOL;

            echo json_encode( self::getConfig( [ 'proj_name' => $projName, 'author' => $author ] ) );
        }    

        static function getConfig( $conf ){
            $std = new stdClass();
            foreach( $conf as $k => $v ){
                $std->$k = $v;
            }
            return $std;
        }