Completed
Push — sidebaracl ( 7a112d...7c3e4a )
by Andreas
04:38
created

Doku_Cli_Opts::isError()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 3
rs 10
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
/**
3
 * Brutally chopped and modified from http://pear.php.net/package/Console_Getopts
4
 *
5
 * PHP Version 5
6
 *
7
 * Copyright (c) 1997-2004 The PHP Group
8
 *
9
 * LICENSE: This source file is subject to the New BSD license that is
10
 * available through the world-wide-web at the following URI:
11
 * http://www.opensource.org/licenses/bsd-license.php. If you did not receive
12
 * a copy of the New BSD License and are unable to obtain it through the web,
13
 * please send a note to [email protected] so we can mail you a copy immediately.
14
 *
15
 * @category Console
16
 * @package  Console_Getopt
17
 * @author   Andrei Zmievski <[email protected]>
18
 * @modified Harry Fuecks hfuecks  gmail.com
19
 * @modified Tanguy Ortolo <[email protected]>
20
 * @license  http://www.opensource.org/licenses/bsd-license.php New BSD License
21
 * @version  CVS: $Id$
22
 * @link     http://pear.php.net/package/Console_Getopt
23
 *
24
 */
25
26
//------------------------------------------------------------------------------
27
/**
28
 * Sets up CLI environment based on SAPI and PHP version
29
 * Helps resolve some issues between the CGI and CLI SAPIs
30
 * as well is inconsistencies between PHP 4.3+ and older versions
31
 */
32
if (version_compare(phpversion(), '4.3.0', '<') || php_sapi_name() == 'cgi') {
33
    // Handle output buffering
34
    @ob_end_flush();
1 ignored issue
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
35
    ob_implicit_flush(true);
36
37
    // PHP ini settings
38
    set_time_limit(0);
39
    ini_set('track_errors', "1");
40
    ini_set('html_errors', "0");
41
    ini_set('magic_quotes_runtime', "0");
42
43
    // Define stream constants
44
    define('STDIN', fopen('php://stdin', 'r'));
45
    define('STDOUT', fopen('php://stdout', 'w'));
46
    define('STDERR', fopen('php://stderr', 'w'));
47
48
    // Close the streams on script termination
49
    register_shutdown_function(
50
        create_function('',
51
        'fclose(STDIN); fclose(STDOUT); fclose(STDERR); return true;')
52
        );
53
}
54
55
//------------------------------------------------------------------------------
56
/**
57
* Error codes
58
*/
59
define('DOKU_CLI_OPTS_UNKNOWN_OPT',1); //Unrecognized option
60
define('DOKU_CLI_OPTS_OPT_ARG_REQUIRED',2); //Option requires argument
61
define('DOKU_CLI_OPTS_OPT_ARG_DENIED',3); //Option not allowed argument
62
define('DOKU_CLI_OPTS_OPT_ABIGUOUS',4);//Option abiguous
63
define('DOKU_CLI_OPTS_ARG_READ',5);//Could not read argv
64
65
//------------------------------------------------------------------------------
66
/**
67
 * Command-line options parsing class.
68
 *
69
 * @author Andrei Zmievski <[email protected]>
70
 *
71
 * @deprecated 2014-05-16
72
 */
73
class Doku_Cli_Opts {
74
75
    /**
76
     * <?php ?>
77
     * @see http://www.sitepoint.com/article/php-command-line-1/3
78
     * @param string $bin_file      executing file name - this MUST be passed the __FILE__ constant
79
     * @param string $short_options short options
80
     * @param array  $long_options  (optional) long options
81
     * @return Doku_Cli_Opts_Container|Doku_Cli_Opts_Error
82
     */
83
    function & getOptions($bin_file, $short_options, $long_options = null) {
84
        $args = Doku_Cli_Opts::readPHPArgv();
85
86
        if ( Doku_Cli_Opts::isError($args) ) {
87
            return $args;
88
        }
89
90
        // Compatibility between "php extensions.php" and "./extensions.php"
91
        if ( realpath($_SERVER['argv'][0]) == $bin_file ) {
92
            $options = Doku_Cli_Opts::getOpt($args,$short_options,$long_options);
0 ignored issues
show
Bug introduced by
It seems like $args defined by \Doku_Cli_Opts::readPHPArgv() on line 84 can also be of type object<Doku_Cli_Opts_Error>; however, Doku_Cli_Opts::getopt() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
93
        } else {
94
            $options = Doku_Cli_Opts::getOpt2($args,$short_options,$long_options);
0 ignored issues
show
Bug introduced by
It seems like $args defined by \Doku_Cli_Opts::readPHPArgv() on line 84 can also be of type object<Doku_Cli_Opts_Error>; however, Doku_Cli_Opts::getopt2() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
95
        }
96
97
        if ( Doku_Cli_Opts::isError($options) ) {
98
            return $options;
99
        }
100
101
        $container = new Doku_Cli_Opts_Container($options);
102
        return $container;
103
    }
104
105
    /**
106
     * Parses the command-line options.
107
     *
108
     * The first parameter to this function should be the list of command-line
109
     * arguments without the leading reference to the running program.
110
     *
111
     * The second parameter is a string of allowed short options. Each of the
112
     * option letters can be followed by a colon ':' to specify that the option
113
     * requires an argument, or a double colon '::' to specify that the option
114
     * takes an optional argument.
115
     *
116
     * The third argument is an optional array of allowed long options. The
117
     * leading '--' should not be included in the option name. Options that
118
     * require an argument should be followed by '=', and options that take an
119
     * option argument should be followed by '=='.
120
     *
121
     * The return value is an array of two elements: the list of parsed
122
     * options and the list of non-option command-line arguments. Each entry in
123
     * the list of parsed options is a pair of elements - the first one
124
     * specifies the option, and the second one specifies the option argument,
125
     * if there was one.
126
     *
127
     * Long and short options can be mixed.
128
     *
129
     * Most of the semantics of this function are based on GNU getopt_long().
130
     *
131
     * @param array  $args          an array of command-line arguments
132
     * @param string $short_options specifies the list of allowed short options
133
     * @param array  $long_options  specifies the list of allowed long options
134
     *
135
     * @return array two-element array containing the list of parsed options and
136
     * the non-option arguments
137
     * @access public
138
     */
139
    function getopt2($args, $short_options, $long_options = null) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
140
        return Doku_Cli_Opts::doGetopt(
141
            2, $args, $short_options, $long_options
142
            );
143
    }
144
145
    /**
146
     * This function expects $args to start with the script name (POSIX-style).
147
     * Preserved for backwards compatibility.
148
     *
149
     * @param array  $args          an array of command-line arguments
150
     * @param string $short_options specifies the list of allowed short options
151
     * @param array  $long_options  specifies the list of allowed long options
152
     *
153
     * @see getopt2()
154
     * @return array two-element array containing the list of parsed options and
155
     * the non-option arguments
156
     */
157
    function getopt($args, $short_options, $long_options = null) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
158
        return Doku_Cli_Opts::doGetopt(
159
            1, $args, $short_options, $long_options
160
            );
161
    }
162
163
    /**
164
     * The actual implementation of the argument parsing code.
165
     *
166
     * @param int    $version       Version to use
167
     * @param array  $args          an array of command-line arguments
168
     * @param string $short_options specifies the list of allowed short options
169
     * @param array  $long_options  specifies the list of allowed long options
170
     *
171
     * @return array
172
     */
173
    function doGetopt($version, $args, $short_options, $long_options = null) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
174
175
        // in case you pass directly readPHPArgv() as the first arg
176
        if (Doku_Cli_Opts::isError($args)) {
177
            return $args;
178
        }
179
        if (empty($args)) {
180
            return array(array(), array());
181
        }
182
        $opts     = array();
183
        $non_opts = array();
184
185
        settype($args, 'array');
186
187
        if ($long_options && is_array($long_options)) {
188
            sort($long_options);
189
        }
190
191
        /*
192
         * Preserve backwards compatibility with callers that relied on
193
         * erroneous POSIX fix.
194
         */
195
        if ($version < 2) {
196
            if (isset($args[0]{0}) && $args[0]{0} != '-') {
197
                array_shift($args);
198
            }
199
        }
200
201
        reset($args);
202
        while (list($i, $arg) = each($args)) {
203
204
            /* The special element '--' means explicit end of
205
               options. Treat the rest of the arguments as non-options
206
               and end the loop. */
207
            if ($arg == '--') {
208
                $non_opts = array_merge($non_opts, array_slice($args, $i + 1));
209
                break;
210
            }
211
212
            if ($arg{0} != '-' || (strlen($arg) > 1 && $arg{1} == '-' && !$long_options)) {
213
                $non_opts = array_merge($non_opts, array_slice($args, $i));
214
                break;
215
            } elseif (strlen($arg) > 1 && $arg{1} == '-') {
216
                $error = Doku_Cli_Opts::_parseLongOption(substr($arg, 2), $long_options, $opts, $args);
0 ignored issues
show
Documentation introduced by
$long_options is of type array|null, but the function expects a array<integer,string>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
217
                if (Doku_Cli_Opts::isError($error))
218
                    return $error;
219
            } elseif ($arg == '-') {
220
                // - is stdin
221
                $non_opts = array_merge($non_opts, array_slice($args, $i));
222
                break;
223
            } else {
224
                $error = Doku_Cli_Opts::_parseShortOption(substr($arg, 1), $short_options, $opts, $args);
225
                if (Doku_Cli_Opts::isError($error))
226
                    return $error;
227
            }
228
        }
229
230
        return array($opts, $non_opts);
231
    }
232
233
    /**
234
     * Parse short option
235
     *
236
     * @param string     $arg           Argument
237
     * @param string     $short_options Available short options
238
     * @param string[][] &$opts
239
     * @param string[]   &$args
240
     *
241
     * @access private
242
     * @return void|Doku_Cli_Opts_Error
243
     */
244
    function _parseShortOption($arg, $short_options, &$opts, &$args) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
245
        $len = strlen($arg);
246
        for ($i = 0; $i < $len; $i++) {
247
            $opt = $arg{$i};
248
            $opt_arg = null;
249
250
            /* Try to find the short option in the specifier string. */
251
            if (($spec = strstr($short_options, $opt)) === false || $arg{$i} == ':')
252
            {
253
                return Doku_Cli_Opts::raiseError(
254
                    DOKU_CLI_OPTS_UNKNOWN_OPT,
255
                    "Unrecognized option -- $opt"
256
                    );
257
            }
258
259
            if (strlen($spec) > 1 && $spec{1} == ':') {
260
                if (strlen($spec) > 2 && $spec{2} == ':') {
261
                    if ($i + 1 < strlen($arg)) {
262
                        /* Option takes an optional argument. Use the remainder of
263
                           the arg string if there is anything left. */
264
                        $opts[] = array($opt, substr($arg, $i + 1));
265
                        break;
266
                    }
267
                } else {
268
                    /* Option requires an argument. Use the remainder of the arg
269
                       string if there is anything left. */
270
                    if ($i + 1 < strlen($arg)) {
271
                        $opts[] = array($opt,  substr($arg, $i + 1));
272
                        break;
273
                    } else if (list(, $opt_arg) = each($args)) {
274
                        /* Else use the next argument. */;
275
                        if (Doku_Cli_Opts::_isShortOpt($opt_arg) || Doku_Cli_Opts::_isLongOpt($opt_arg))
276
                            return Doku_Cli_Opts::raiseError(
277
                                DOKU_CLI_OPTS_OPT_ARG_REQUIRED,
278
                                "option requires an argument --$opt"
279
                                );
280
                    }
281
                    else
282
                        return Doku_Cli_Opts::raiseError(
283
                            DOKU_CLI_OPTS_OPT_ARG_REQUIRED,
284
                            "Option requires an argument -- $opt"
285
                            );
286
                }
287
            }
288
289
            $opts[] = array($opt, $opt_arg);
290
        }
291
    }
292
293
    /**
294
     * Checks if an argument is a short option
295
     *
296
     * @param string $arg Argument to check
297
     *
298
     * @access private
299
     * @return bool
300
     */
301
    function _isShortOpt($arg){
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
302
        return strlen($arg) == 2 && $arg[0] == '-'
303
               && preg_match('/[a-zA-Z]/', $arg[1]);
304
    }
305
306
    /**
307
     * Checks if an argument is a long option
308
     *
309
     * @param string $arg Argument to check
310
     *
311
     * @access private
312
     * @return bool
313
     */
314
    function _isLongOpt($arg){
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
315
        return strlen($arg) > 2 && $arg[0] == '-' && $arg[1] == '-' &&
316
               preg_match('/[a-zA-Z]+$/', substr($arg, 2));
317
    }
318
319
    /**
320
     * Parse long option
321
     *
322
     * @param string     $arg          Argument
323
     * @param string[]   $long_options Available long options
324
     * @param string[][] &$opts
325
     * @param string[]   &$args
326
     *
327
     * @access private
328
     * @return void|Doku_Cli_Opts_Error
329
     */
330
    function _parseLongOption($arg, $long_options, &$opts, &$args) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
331
        @list($opt, $opt_arg) = explode('=', $arg, 2);
1 ignored issue
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
332
        $opt_len = strlen($opt);
333
        $opt_cnt = count($long_options);
334
335
        for ($i = 0; $i < $opt_cnt; $i++) {
336
            $long_opt  = $long_options[$i];
337
            $opt_start = substr($long_opt, 0, $opt_len);
338
339
            $long_opt_name = str_replace('=', '', $long_opt);
0 ignored issues
show
Unused Code introduced by
$long_opt_name is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
340
341
            /* Option doesn't match. Go on to the next one. */
342
            if ($opt_start != $opt)
343
                continue;
344
345
            $opt_rest = substr($long_opt, $opt_len);
346
347
            /* Check that the options uniquely matches one of the allowed
348
               options. */
349
            if ($i + 1 < count($long_options)) {
350
                $next_option_rest = substr($long_options[$i + 1], $opt_len);
351
            } else {
352
                $next_option_rest = '';
353
            }
354
355
            if ($opt_rest != '' && $opt{0} != '=' &&
356
                $i + 1 < $opt_cnt &&
357
                $opt == substr($long_options[$i+1], 0, $opt_len) &&
358
                $next_option_rest != '' &&
359
                $next_option_rest{0} != '=') {
360
                return Doku_Cli_Opts::raiseError(
361
                    DOKU_CLI_OPTS_OPT_ABIGUOUS,
362
                    "Option --$opt is ambiguous"
363
                    );
364
            }
365
366
            if (substr($long_opt, -1) == '=') {
367
                if (substr($long_opt, -2) != '==') {
368
                    /* Long option requires an argument.
369
                       Take the next argument if one wasn't specified. */;
370
                    if (!strlen($opt_arg) && !(list(, $opt_arg) = each($args))) {
371
                        return Doku_Cli_Opts::raiseError(
372
                            DOKU_CLI_OPTS_OPT_ARG_REQUIRED,
373
                            "Option --$opt requires an argument"
374
                            );
375
                    }
376
377
                    if (Doku_Cli_Opts::_isShortOpt($opt_arg)
378
                        || Doku_Cli_Opts::_isLongOpt($opt_arg))
379
                        return Doku_Cli_Opts::raiseError(
380
                            DOKU_CLI_OPTS_OPT_ARG_REQUIRED,
381
                            "Option --$opt requires an argument"
382
                            );
383
                }
384
            } else if ($opt_arg) {
385
                return Doku_Cli_Opts::raiseError(
386
                    DOKU_CLI_OPTS_OPT_ARG_DENIED,
387
                    "Option --$opt doesn't allow an argument"
388
                    );
389
            }
390
391
            $opts[] = array('--' . $opt, $opt_arg);
392
            return;
393
        }
394
395
        return Doku_Cli_Opts::raiseError(
396
            DOKU_CLI_OPTS_UNKNOWN_OPT,
397
            "Unrecognized option --$opt"
398
            );
399
    }
400
401
    /**
402
     * Safely read the $argv PHP array across different PHP configurations.
403
     * Will take care on register_globals and register_argc_argv ini directives
404
     *
405
     * @access public
406
     * @return array|Doku_Cli_Opts_Error the $argv PHP array or PEAR error if not registered
407
     */
408
    function readPHPArgv() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
409
        global $argv;
410
        if (!is_array($argv)) {
411
            if (!@is_array($_SERVER['argv'])) {
412
                if (!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv'])) {
413
                    return Doku_Cli_Opts::raiseError(
414
                        DOKU_CLI_OPTS_ARG_READ,
415
                        "Could not read cmd args (register_argc_argv=Off?)"
416
                        );
417
                }
418
                return $GLOBALS['HTTP_SERVER_VARS']['argv'];
419
            }
420
            return $_SERVER['argv'];
421
        }
422
        return $argv;
423
    }
424
425
    /**
426
     * @param $code
427
     * @param $msg
428
     * @return Doku_Cli_Opts_Error
429
     */
430
    function raiseError($code, $msg) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
431
        return new Doku_Cli_Opts_Error($code, $msg);
432
    }
433
434
    /**
435
     * @param $obj
436
     * @return bool
437
     */
438
    function isError($obj) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
439
        return is_a($obj, 'Doku_Cli_Opts_Error');
440
    }
441
442
}
443
444
//------------------------------------------------------------------------------
445
class Doku_Cli_Opts_Error {
446
447
    var $code;
448
    var $msg;
449
450
    function __construct($code, $msg) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
451
        $this->code = $code;
452
        $this->msg = $msg;
453
    }
454
455
    function getMessage() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
456
        return $this->msg;
457
    }
458
459
    function isError() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
460
        return true;
461
    }
462
463
}
464
465
//------------------------------------------------------------------------------
466
class Doku_Cli_Opts_Container {
467
468
    var $options = array();
469
    var $args = array();
470
471
    function __construct($options) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
472
        foreach ( $options[0] as $option ) {
473
            if ( false !== ( strpos($option[0], '--') ) ) {
474
                $opt_name = substr($option[0], 2);
475
            } else {
476
                $opt_name = $option[0];
477
            }
478
            $this->options[$opt_name] = $option[1];
479
        }
480
481
        $this->args = $options[1];
482
    }
483
484
    function has($option) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
485
        return array_key_exists($option, $this->options);
486
    }
487
488
    function get($option) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
489
        if ( isset($this->options[$option]) ) {
490
            return ( $this->options[$option] ) ;
491
        }
492
    }
493
494
    function arg($index) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
495
        if ( isset($this->args[$index]) ) {
496
            return $this->args[$index];
497
        }
498
    }
499
500
    function numArgs() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
501
        return count($this->args);
502
    }
503
504
    function hasArgs() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
505
        return count($this->args) !== 0;
506
    }
507
508
    function isError() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
509
        return false;
510
    }
511
512
}
513