1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
<?php /** * LegacyProxy class file. */
namespace Automattic\WooCommerce\Proxies;
use Automattic\WooCommerce\Internal\DependencyManagement\Definition; use Automattic\WooCommerce\Utilities\StringUtil; use Automattic\WooCommerce\Vendor\Psr\Container\ContainerInterface;
/** * Proxy class to access legacy WooCommerce functionality. * * This class should be used to interact with code outside the `src` directory, especially functions and classes * in the `includes` directory, unless a more specific proxy exists for the functionality at hand (e.g. `ActionsProxy`). * Idempotent functions can be executed directly. */ class LegacyProxy {
/** * Gets an instance of a given legacy class. * This must not be used to get instances of classes in the `src` directory. * * If a given class needs a special procedure to get an instance of it, * please add a private get_instance_of_(lowercased_class_name) and it will be * automatically invoked. See also how objects of classes having a static `instance` * method are retrieved, similar approaches can be used as needed to make use * of existing factory methods such as e.g. 'load'. * * @param string $class_name The name of the class to get an instance for. * @param mixed ...$args Parameters to be passed to the class constructor or to the appropriate internal 'get_instance_of_' method. * * @return object The instance of the class. * @throws \Exception The requested class has a namespace starting with ' Automattic\WooCommerce', or there was an error creating an instance of the class. */ public function get_instance_of( string $class_name, ...$args ) { if ( StringUtil::starts_with( $class_name, 'Automattic\\WooCommerce\\' ) ) { throw new \Exception( 'The LegacyProxy class is not intended for getting instances of classes whose namespace starts with \'Automattic\\WooCommerce\', please use ' . Definition::INJECTION_METHOD . ' method injection or the instance of ' . ContainerInterface::class . ' for that.' ); }
// If a class has a dedicated method to obtain a instance, use it. $method = 'get_instance_of_' . strtolower( $class_name ); if ( method_exists( __CLASS__, $method ) ) { return $this->$method( ...$args ); }
// If the class is a singleton, use the "instance" method. if ( method_exists( $class_name, 'instance' ) ) { return $class_name::instance( ...$args ); }
// If the class has a "load" method, use it. if ( method_exists( $class_name, 'load' ) ) { return $class_name::load( ...$args ); }
// Fallback to simply creating a new instance of the class. return new $class_name( ...$args ); }
/** * Get an instance of a class implementing WC_Queue_Interface. * * @return \WC_Queue_Interface The instance. */ private function get_instance_of_wc_queue_interface() { return \WC_Queue::instance(); }
/** * Call a user function. This should be used to execute any non-idempotent function, especially * those in the `includes` directory or provided by WordPress. * * @param string $function_name The function to execute. * @param mixed ...$parameters The parameters to pass to the function. * * @return mixed The result from the function. */ public function call_function( $function_name, ...$parameters ) { return call_user_func_array( $function_name, $parameters ); }
/** * Call a static method in a class. This should be used to execute any non-idempotent method in classes * from the `includes` directory. * * @param string $class_name The name of the class containing the method. * @param string $method_name The name of the method. * @param mixed ...$parameters The parameters to pass to the method. * * @return mixed The result from the method. */ public function call_static( $class_name, $method_name, ...$parameters ) { return call_user_func_array( "$class_name::$method_name", $parameters ); }
/** * Get the value of a global. * * @param string $global_name The name of the global to get the value for. * @return mixed The value of the global. */ public function get_global( string $global_name ) { return $GLOBALS[ $global_name ]; }
/** * Terminates execution of the script. * * @param int|string $status An error code to be returned, or an error message to be shown. * @return void */ public function exit( $status = '' ) { // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped exit( $status ); } }
|