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


    本节用类与静态变量改造之前的例子: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;
            }
  • 相关阅读:
    深入理解flex布局的flexgrow、flexshrink、flexbasis
    443端口
    C# 元组和弃元的用法
    腾讯三面:进程写文件过程中,进程崩溃了,文件数据会丢吗?
    60 个神级 VS Code 插件!!
    面试官:HashSet 的实现原理是怎样的?底层是什么数据结构?被问到了。。
    微信为什么使用 SQLite 保存聊天记录?(来长长见识了!)
    Nacos 2.1.1 正式发布,真心强!
    为何 JetBrains 公司做 IDE 就可以养活自己,而国内公司却很难做到?
    阿里一面:Spring Bean 默认是单例的,高并发情况下,如何保证并发安全?
  • 原文地址:https://www.cnblogs.com/ghostwu/p/8922091.html
Copyright © 2020-2023  润新知