public static function getInstance()
 {
     if (!self::$instance instanceof self) {
         self::$instance = new self();
     }
     return self::$instance;
 }
 /**
  * 初始化fileSummaryContext
  * @param string $project_path
  */
 private function initFileSummaryContext($project_path, $allFiles)
 {
     global $project_path;
     $fileName = str_replace('/', '_', $project_path);
     $fileName = str_replace(':', '_', $fileName);
     $serialPath = CURR_PATH . "/data/fileSummaryConetxtSerialData/" . $fileName;
     if (!is_file($serialPath)) {
         //创建文件
         $fileHandler = fopen($serialPath, 'w');
         fclose($fileHandler);
     }
     //判断本地序列化文件中是否存在UserSanitizeFuncConetxt
     if (($serial_str = file_get_contents($serialPath)) != '') {
         $fileSummaryMap = unserialize($serial_str);
         $fileSummaryContext = FileSummaryContext::getInstance();
         $fileSummaryContext->setFileSummaryMap($fileSummaryMap);
         return;
     }
     //没有序列化,则获取fileSummary
     $fileSummaryContext = FileSummaryContext::getInstance();
     foreach ($allFiles as $fileAbsPath) {
         $ret = FileSummaryGenerator::getFileSummary($fileAbsPath);
         if ($ret) {
             $fileSummaryContext->addSummaryToMap($ret);
         }
     }
     //对FileSummaryContext进行序列化,加快下次读取速度
     $this->serializeContext($serialPath, $fileSummaryContext->getFileSummaryMap());
 }
 /**
  * 获取当前文件include的所有文件的summary
  * @param FileSummary $fileSummary
  * @return array(fileSummarys)
  */
 public static function getIncludeFilesDataFlows($fileSummary)
 {
     if (!is_object($fileSummary)) {
         return;
     }
     //1.得到include files
     $includeFiles = $fileSummary->getIncludeMap();
     $currentFilePath = $fileSummary->getPath();
     //2.foreach() files
     $retFileSummary = array();
     foreach ($includeFiles as $rpath) {
         $absPath = FileUtils::getAbsPath($currentFilePath, $rpath);
         if (!$absPath) {
             continue;
         }
         //  查看是否在fileSummaryContext中
         //  得到DataFlows
         $fileSummaryContext = FileSummaryContext::getInstance();
         $ret = $fileSummaryContext->findSummaryByPath($absPath);
         if (is_object($ret)) {
             //查看此文件是否有include文件
             $pRetFiles = self::getIncludeFilesDataFlows($ret);
             $retFileSummary = array_merge($pRetFiles, $retFileSummary);
             $retFileSummary = array_merge(array($ret), $retFileSummary);
         } else {
             $includeFileSummary = self::getFileSummary($absPath);
             if (is_object($includeFileSummary)) {
                 $pRetFiles = self::getIncludeFilesDataFlows($includeFileSummary);
                 $retFileSummary = array_merge($pRetFiles, $retFileSummary);
                 $retFileSummary = array_merge(array($includeFileSummary), $retFileSummary);
             }
         }
     }
     //return all files summary
     //include在前的,在数组前面
     return $retFileSummary;
 }