Completed
Push — master ( 6dc769...79788b )
by Jean-Christophe
01:27
created

ClassUtils::getClassNameFromPhpCode()   B

Complexity

Conditions 5
Paths 3

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 13
rs 8.8571
cc 5
eloc 9
nc 3
nop 1
1
<?php
2
3
namespace micro\cache;
4
5
class ClassUtils {
6
7
	/**
8
	 * get the full name (name \ namespace) of a class from its file path
9
	 * result example: (string) "I\Am\The\Namespace\Of\This\Class"
10
	 *
11
	 * @param $filePathName
12
	 *
13
	 * @return string
14
	 */
15
	public static function getClassFullNameFromFile($filePathName) {
16
		$phpCode=file_get_contents($filePathName);
17
		return self::getClassNamespaceFromPhpCode($phpCode) . '\\' . self::getClassNameFromPhpCode($phpCode);
18
	}
19
20
	public static function cleanClassname($classname) {
21
		return \str_replace("\\", "\\\\", $classname);
22
	}
23
24
	/**
25
	 * Returns a cleanly namespace
26
	 * @param array|string $parts
27
	 * @return string
28
	 */
29
	public static function getNamespaceFromParts($parts){
30
		$resultArray=[];
31
		if(!\is_array($parts)){
32
			$parts=[$parts];
33
		}
34
		foreach ($parts as $part){
35
			$resultArray=\array_merge($resultArray,\explode("\\", $part));
36
		}
37
		$resultArray=\array_diff($resultArray, [""]);
38
		return \implode("\\", $resultArray);
39
	}
40
41
	/**
42
	 * build and return an object of a class from its file path
43
	 *
44
	 * @param $filePathName
45
	 *
46
	 * @return mixed
47
	 */
48
	public static function getClassObjectFromFile($filePathName) {
49
		$classString=self::getClassFullNameFromFile($filePathName);
50
		$object=new $classString();
51
		return $object;
52
	}
53
54
	/**
55
	 * get the class namespace form file path using token
56
	 *
57
	 * @param $filePathName
58
	 *
59
	 * @return null|string
60
	 */
61
	public static function getClassNamespaceFromFile($filePathName) {
62
		$phpCode=file_get_contents($filePathName);
63
		return self::getClassNamespaceFromPhpCode($phpCode);
64
	}
65
66
	private static function getClassNamespaceFromPhpCode($phpCode) {
67
		$tokens=token_get_all($phpCode);
68
		$count=count($tokens);
69
		$i=0;
70
		$namespace='';
71
		$namespace_ok=false;
72
		while ( $i < $count ) {
73
			$token=$tokens[$i];
74
			if (is_array($token) && $token[0] === T_NAMESPACE) {
75
				// Found namespace declaration
76
				while ( ++$i < $count ) {
77
					if ($tokens[$i] === ';') {
78
						$namespace_ok=true;
79
						$namespace=trim($namespace);
80
						break;
81
					}
82
					$namespace.=is_array($tokens[$i]) ? $tokens[$i][1] : $tokens[$i];
83
				}
84
				break;
85
			}
86
			$i++;
87
		}
88
		if (!$namespace_ok) {
89
			return null;
90
		} else {
91
			return $namespace;
92
		}
93
	}
94
95
	/**
96
	 * get the class name form file path using token
97
	 *
98
	 * @param $filePathName
99
	 *
100
	 * @return mixed
101
	 */
102
	public static function getClassNameFromFile($filePathName) {
103
		$phpCode=file_get_contents($filePathName);
104
		return self::getClassNameFromPhpCode($phpCode);
105
	}
106
107
	private static function getClassNameFromPhpCode($phpCode){
108
		$classes=array ();
109
		$tokens=token_get_all($phpCode);
110
		$count=count($tokens);
111
		for($i=2; $i < $count; $i++) {
112
			if ($tokens[$i - 2][0] == T_CLASS && $tokens[$i - 1][0] == T_WHITESPACE && $tokens[$i][0] == T_STRING) {
113
				$class_name=$tokens[$i][1];
114
				$classes[]=$class_name;
115
			}
116
		}
117
118
		return $classes[0];
119
	}
120
121
	public static function getClassNameWithNS($defaultNS,$name){
122
		if(\strpos($name, "\\")===false){
123
			$name=$defaultNS."\\".$name;
124
		}
125
		return $name;
126
	}
127
128
	public static function getClassSimpleName($classnameWithNamespace){
129
		return substr($classnameWithNamespace, strrpos($classnameWithNamespace, '\\')+1);
130
	}
131
}
132