最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】PHP中的构造函数__construct不工作

PHP crifan 3060浏览 0评论

【问题】

折腾:

【已解决】PHP中如何获得当前PHP文件的路径

期间,调试了半天,发现加了构造函数后:

class crifanLib {
    private $logFile;
    
    function __construct() {
        printAutoNewline("into crifanLib __construct");
        echo "into __construct 222";
        //logInit();
    }

    /***********************************************************************************************
    * String/Path
    ***********************************************************************************************/
    
    /*
     * 【已解决】PHP中如何实现路径拼接(两个路径合并)以及合并文件夹路径和文件名
     * https://www.crifan.com/php_path_concatenation_combine_directory_and_filename
     * eg:
     * from:
     * D:\tmp\WordPress\DevRoot\httpd-2.2.19-win64\httpd-2.2-x64\htdocs\php_test\35934503_data
     * cookie_jar.txt
     * to:
     * D:\tmp\WordPress\DevRoot\httpd-2.2.19-win64\httpd-2.2-x64\htdocs\php_test\35934503_data\cookie_jar.txt
     */
    function concatenatePath($headPath, $tailPath) {
        $realHeadPath = realpath($headPath);
        // printAutoNewline("realHeadPath=".$realHeadPath);
        //$realTailPath = realpath($tailPath);
        //printAutoNewline("realTailPath=".$realTailPath);
        //$concatnatedPath = $realHeadPath.DIRECTORY_SEPARATOR.$realTailPath;
        // printAutoNewline("tailPath=".$tailPath);
        
        $concatnatedPath = $realHeadPath.DIRECTORY_SEPARATOR.$tailPath;
        // printAutoNewline("concatnatedPath=".$concatnatedPath);
        return $concatnatedPath;
    }

    /***********************************************************************************************
    * Log
    ***********************************************************************************************/
    
    /*
        Init log file
    */
    function logInit($inputLogFile = null) {
        // set default log file name, path is current php file

        // // in case of Windows set default log file
        // //http://stackoverflow.com/questions/1482260/how-to-get-the-os-on-which-php-is-running
        // //http://php.net/manual/zh/function.php-uname.php
        // if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
            // $defautLogFile = 'C:/php/defLogFile.log';
        // }
        // // set default log file for Linux and other systems
        // else {
            // $defautLogFile = '/tmp/defLogFile.log';
        // }

        printAutoNewline("Before call getcwd()");
        echo "Before call getcwd() 222";
        $logFolder = getcwd();
        printAutoNewline($logFolder);
        $logFilename = "log_".date('YmdHis').".log";
        printAutoNewline($logFilename);
        $defautLogFile = concatenatePath($logFolder, $logFilename);
        printAutoNewline($defautLogFile);

        $this->logFile = $inputLogFile ? $inputLogFile : $defautLogFile;
        printAutoNewline($this->logFile);
    }

别处调用:

include_once "crifanLib.php";

//test log
$crifanLib = new crifanLib();
//$crifanLib->logInit("/var/www/120.26.121.239/public_html/php/access_token/logTest.log");
$crifanLib->logWrite("This is crifanLib log test message not pass log file name");

代码不工作了:

没有任何输出。

【折腾过程】

1.后来是加了:

include_once "crifanLib.php";

//test log
print_r("before into crifanLib 111 \r\n");
echo "before into crifanLib 222\r\n";
$crifanLib = new crifanLib();
//$crifanLib->logInit("/var/www/xxxx/public_html/php/access_token/logTest.log");
$crifanLib->logWrite("This is crifanLib log test message not pass log file name");

才看到输出:

add more log then see ouput for before php construct

 

2.然后验证了推断:

应该是由于__construct有问题,不工作。

搜:

php __construct not work

参考:

__construct not working – PHP Coding Help – PHP Freaks

提到了php v4是旧的语法。

所以去看了看此处自己的PHP的版本,的确是v5的:

root@chantyou:access_token# php --version
PHP 5.4.16 (cli) (built: Jun 23 2015 21:17:27) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

所以不存在该问题。

3.还是不知道错误出在何处。

又去调试了半天,终于知道错误原因了:

搜:

php __construct call other function

参考:

PHP: Calling a user-defined function inside constructor? – Stack Overflow

才知道如何改:

前面要加$this->yourFunction();

即,之前的:

class crifanLib {
    private $logFile;

    function __construct() {
        logInit();
    }
    
    /*
        Init log file
    */
    function logInit($inputLogFile = null) {
        ......
    }

和:

class crifanLib {
    private $logFile;
    function __construct() {
        echo "into __construct 111111";
        printAutoNewline("into crifanLib __construct 2222222");
    }

    function printAutoNewline($contentToPrint) {
        print_r($contentToPrint."<br />");
    }

都是有问题的:

不是在构造函数中__construct不能调用类中的用户自定义的其他函数;

而是,在类中,调用自己类内部的函数,要用$this->xxx才行。。。

 

【总结】

PHP中,不论是在类的哪里,包括构造函数__construct中,调用别的东西,包括变量,函数,都要记得写成

  • $this->xxx
  • $this->xxx()

而不要直接写成

  • xxx
  • xxx()

了。否则就错误了,并且没有任何报错输出。。。。

转载请注明:在路上 » 【已解决】PHP中的构造函数__construct不工作

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.172 seconds, using 22.15MB memory