MDL-76362 various: Avoid passing nulls to functions that don't allow nulls

PHP 8.1 is more strict on the parameter type. Functions such as trim(), strlen(), str_replace(), etc
show notice when null is passed as an argument
This commit is contained in:
Marina Glancy 2022-11-17 16:04:24 +01:00 committed by Andrew Nicols
parent 491ed7b200
commit b0a83aa7bd
69 changed files with 105 additions and 102 deletions

View File

@ -45,7 +45,7 @@ class helper {
// Form field is PARAM_ALPHANUMEXT and we are sending fully qualified class names // Form field is PARAM_ALPHANUMEXT and we are sending fully qualified class names
// as option names, but replacing the backslash for a string that is really unlikely // as option names, but replacing the backslash for a string that is really unlikely
// to ever be part of a class name. // to ever be part of a class name.
return str_replace('\\', '__', $class); return str_replace('\\', '__', $class ?? '');
} }
/** /**

View File

@ -437,7 +437,7 @@ function print_combined_run_output($processes, $stoponfail = false) {
$process->stop(0); $process->stop(0);
} }
$strlentoprint = strlen($update); $strlentoprint = strlen($update ?? '');
// If not enough dots printed on line then just print. // If not enough dots printed on line then just print.
if ($strlentoprint < $remainingprintlen) { if ($strlentoprint < $remainingprintlen) {

View File

@ -205,7 +205,7 @@ class manager {
* @return string * @return string
*/ */
public static function get_contenthash(?string $content = null): string { public static function get_contenthash(?string $content = null): string {
return sha1($content); return sha1($content ?? '');
} }
/** /**

View File

@ -47,7 +47,7 @@ class data_registry {
* @return string[] * @return string[]
*/ */
public static function var_names_from_context($classname, $pluginname = '') { public static function var_names_from_context($classname, $pluginname = '') {
$pluginname = trim($pluginname); $pluginname = trim($pluginname ?? '');
if (!empty($pluginname)) { if (!empty($pluginname)) {
$categoryvar = $classname . '_' . $pluginname . '_category'; $categoryvar = $classname . '_' . $pluginname . '_category';
$purposevar = $classname . '_' . $pluginname . '_purpose'; $purposevar = $classname . '_' . $pluginname . '_purpose';

View File

@ -109,7 +109,7 @@ class purpose_exporter extends persistent_exporter {
$values['formattedlawfulbases'] = $formattedbases; $values['formattedlawfulbases'] = $formattedbases;
$formattedsensitivereasons = []; $formattedsensitivereasons = [];
$sensitivereasons = explode(',', $this->persistent->get('sensitivedatareasons')); $sensitivereasons = explode(',', $this->persistent->get('sensitivedatareasons') ?? '');
if (!empty($sensitivereasons)) { if (!empty($sensitivereasons)) {
foreach ($sensitivereasons as $reason) { foreach ($sensitivereasons as $reason) {
if (empty(trim($reason))) { if (empty(trim($reason))) {

View File

@ -74,10 +74,10 @@ trait reader {
* @return mixed Decoded value * @return mixed Decoded value
*/ */
public static function decode_other(?string $other) { public static function decode_other(?string $other) {
if ($other === 'N;' || preg_match('~^.:~', $other)) { if ($other === 'N;' || preg_match('~^.:~', $other ?? '')) {
return unserialize($other); return unserialize($other);
} else { } else {
return json_decode($other, true); return json_decode($other ?? '', true);
} }
} }

View File

@ -60,8 +60,8 @@ class remote_resource {
public function __construct(\curl $curl, url $url, \stdClass $metadata) { public function __construct(\curl $curl, url $url, \stdClass $metadata) {
$this->curl = $curl; $this->curl = $curl;
$this->url = $url; $this->url = $url;
$this->filename = pathinfo($this->url->get_path(), PATHINFO_FILENAME); $this->filename = pathinfo($this->url->get_path() ?? '', PATHINFO_FILENAME);
$this->extension = pathinfo($this->url->get_path(), PATHINFO_EXTENSION); $this->extension = pathinfo($this->url->get_path() ?? '', PATHINFO_EXTENSION);
$this->metadata = $metadata; $this->metadata = $metadata;
} }

View File

@ -1828,7 +1828,7 @@ class model {
*/ */
public function get_name() { public function get_name() {
if (trim($this->model->name) === '') { if (trim($this->model->name ?? '') === '') {
return $this->get_target()->get_name(); return $this->get_target()->get_name();
} else { } else {

View File

@ -197,7 +197,7 @@ class encrypted_final_element extends backup_final_element {
$iv = self::generate_encryption_random_key(openssl_cipher_iv_length(backup::CIPHER)); $iv = self::generate_encryption_random_key(openssl_cipher_iv_length(backup::CIPHER));
// Everything is ready, let's encrypt and prepend the 1-shot iv. // Everything is ready, let's encrypt and prepend the 1-shot iv.
$value = $iv . openssl_encrypt($value, backup::CIPHER, $this->key, OPENSSL_RAW_DATA, $iv); $value = $iv . openssl_encrypt($value ?? '', backup::CIPHER, $this->key, OPENSSL_RAW_DATA, $iv);
// Calculate the hmac of the value (iv + encrypted) and prepend it. // Calculate the hmac of the value (iv + encrypted) and prepend it.
$hmac = hash_hmac('sha256', $value, $this->key, true); $hmac = hash_hmac('sha256', $value, $this->key, true);

View File

@ -170,7 +170,7 @@ class restore_decode_processor {
*/ */
protected function precheck_content($content) { protected function precheck_content($content) {
// Look for $@ in content (all interlinks contain that) // Look for $@ in content (all interlinks contain that)
return (strpos($content, '$@') === false) ? false : $content; return (strpos($content ?? '', '$@') === false) ? false : $content;
} }
} }

View File

@ -55,7 +55,7 @@ class restore_structure_parser_processor extends grouped_parser_processor {
return ''; return '';
} else if (is_numeric($cdata)) { } else if (is_numeric($cdata)) {
return $cdata; return $cdata;
} else if (strlen($cdata) < 32) { // Impossible to have one link in 32cc } else if (strlen($cdata ?? '') < 32) { // Impossible to have one link in 32cc
return $cdata; // (http://10.0.0.1/file.php/1/1.jpg, http://10.0.0.1/mod/url/view.php?id=) return $cdata; // (http://10.0.0.1/file.php/1/1.jpg, http://10.0.0.1/mod/url/view.php?id=)
} }

View File

@ -107,7 +107,7 @@ abstract class xml_output {
if (!$this->running) { if (!$this->running) {
throw new xml_output_exception('xml_output_not_started'); throw new xml_output_exception('xml_output_not_started');
} }
$lenc = strlen($content); // Get length in bytes $lenc = strlen($content ?? ''); // Get length in bytes
if ($lenc == 0) { // 0 length contents, nothing to do if ($lenc == 0) { // 0 length contents, nothing to do
return; return;
} }

View File

@ -260,7 +260,7 @@ class xml_writer {
* ignores the rest of characters. Also normalize linefeeds and return chars. * ignores the rest of characters. Also normalize linefeeds and return chars.
*/ */
protected function xml_safe_utf8($content) { protected function xml_safe_utf8($content) {
$content = preg_replace('/[\x-\x8\xb-\xc\xe-\x1f\x7f]/is','', $content); // clean CTRL chars $content = preg_replace('/[\x-\x8\xb-\xc\xe-\x1f\x7f]/is','', $content ?? ''); // clean CTRL chars
$content = preg_replace("/\r\n|\r/", "\n", $content); // Normalize line&return=>line $content = preg_replace("/\r\n|\r/", "\n", $content); // Normalize line&return=>line
return $content; return $content;
} }

View File

@ -170,8 +170,8 @@ class backpack_api_mapping {
$url = str_replace('[SCHEME]', $urlscheme, $url); $url = str_replace('[SCHEME]', $urlscheme, $url);
$url = str_replace('[HOST]', $urlhost, $url); $url = str_replace('[HOST]', $urlhost, $url);
$url = str_replace('[URL]', $apiurl, $url); $url = str_replace('[URL]', $apiurl, $url);
$url = str_replace('[PARAM1]', $param1, $url); $url = str_replace('[PARAM1]', $param1 ?? '', $url);
$url = str_replace('[PARAM2]', $param2, $url); $url = str_replace('[PARAM2]', $param2 ?? '', $url);
return $url; return $url;
} }

View File

@ -634,7 +634,7 @@ class cache_helper {
*/ */
public static function hash_key($key, cache_definition $definition) { public static function hash_key($key, cache_definition $definition) {
if ($definition->uses_simple_keys()) { if ($definition->uses_simple_keys()) {
if (debugging() && preg_match('#[^a-zA-Z0-9_]#', $key)) { if (debugging() && preg_match('#[^a-zA-Z0-9_]#', $key ?? '')) {
throw new coding_exception('Cache definition '.$definition->get_id().' requires simple keys. Invalid key provided.', $key); throw new coding_exception('Cache definition '.$definition->get_id().' requires simple keys. Invalid key provided.', $key);
} }
// We put the key first so that we can be sure the start of the key changes. // We put the key first so that we can be sure the start of the key changes.

View File

@ -64,7 +64,7 @@ class course_summary_exporter extends \core\external\exporter {
if ($progress === 0 || $progress > 0) { if ($progress === 0 || $progress > 0) {
$hasprogress = true; $hasprogress = true;
} }
$progress = floor($progress); $progress = floor($progress ?? 0);
$coursecategory = \core_course_category::get($this->data->category, MUST_EXIST, true); $coursecategory = \core_course_category::get($this->data->category, MUST_EXIST, true);
return array( return array(
'fullnamedisplay' => get_course_display_name_for_list($this->data), 'fullnamedisplay' => get_course_display_name_for_list($this->data),

View File

@ -618,7 +618,7 @@ abstract class base {
$course = $this->get_course(); $course = $this->get_course();
try { try {
$sectionpreferences = (array) json_decode( $sectionpreferences = (array) json_decode(
get_user_preferences('coursesectionspreferences_' . $course->id, null, $USER->id) get_user_preferences('coursesectionspreferences_' . $course->id, null, $USER->id) ?? ''
); );
if (empty($sectionpreferences)) { if (empty($sectionpreferences)) {
$sectionpreferences = []; $sectionpreferences = [];

View File

@ -84,7 +84,7 @@ class frontpagesection implements named_templatable, renderable {
$sectionoutput = new $this->sectionclass($format, $section); $sectionoutput = new $this->sectionclass($format, $section);
$sectionoutput->hide_controls(); $sectionoutput->hide_controls();
if (trim($section->name) == '') { if (trim($section->name ?? '') == '') {
$sectionoutput->hide_title(); $sectionoutput->hide_title();
} }

View File

@ -148,7 +148,7 @@ switch ($mode) {
$coursenode->collapse = true; $coursenode->collapse = true;
$coursenode->make_inactive(); $coursenode->make_inactive();
if (!preg_match('/^user\d{0,}$/', $activenode->key)) { // No user name found. if (!preg_match('/^user\d{0,}$/', $activenode->key ?? '')) { // No user name found.
$userurl = new moodle_url('/user/view.php', array('id' => $user->id, 'course' => $course->id)); $userurl = new moodle_url('/user/view.php', array('id' => $user->id, 'course' => $course->id));
// Add the user name. // Add the user name.
$usernode = $activenode->add(fullname($user), $userurl, navigation_node::TYPE_SETTING); $usernode = $activenode->add(fullname($user), $userurl, navigation_node::TYPE_SETTING);

View File

@ -92,6 +92,6 @@ class field extends persistent {
* @return array * @return array
*/ */
protected function get_configdata() : array { protected function get_configdata() : array {
return json_decode($this->raw_get('configdata'), true) ?? array(); return json_decode($this->raw_get('configdata') ?? '', true) ?? array();
} }
} }

View File

@ -997,7 +997,7 @@ class data_connector extends DataConnector {
$consumer->consumerName = $record->consumername; $consumer->consumerName = $record->consumername;
$consumer->consumerVersion = $record->consumerversion; $consumer->consumerVersion = $record->consumerversion;
$consumer->consumerGuid = $record->consumerguid; $consumer->consumerGuid = $record->consumerguid;
$consumer->profile = json_decode($record->profile); $consumer->profile = json_decode($record->profile ?? '');
$consumer->toolProxy = $record->toolproxy; $consumer->toolProxy = $record->toolproxy;
$settings = unserialize($record->settings); $settings = unserialize($record->settings);
if (!is_array($settings)) { if (!is_array($settings)) {

View File

@ -78,8 +78,8 @@ class http_client implements IHttpClient {
if (!$this->curlclient->get_errno() && !$this->curlclient->error) { if (!$this->curlclient->get_errno() && !$this->curlclient->error) {
// No errors, so format the response. // No errors, so format the response.
$headersize = $info['header_size']; $headersize = $info['header_size'];
$resheaders = substr($res, 0, $headersize); $resheaders = substr($res ?? '', 0, $headersize);
$resbody = substr($res, $headersize); $resbody = substr($res ?? '', $headersize);
$headerlines = array_filter(explode("\r\n", $resheaders)); $headerlines = array_filter(explode("\r\n", $resheaders));
$parsedresponseheaders = [ $parsedresponseheaders = [
'httpstatus' => array_shift($headerlines) 'httpstatus' => array_shift($headerlines)

View File

@ -410,7 +410,7 @@ class user extends tablelike implements selectable_items {
$isscale = ($gradeitem->gradetype == GRADE_TYPE_SCALE); $isscale = ($gradeitem->gradetype == GRADE_TYPE_SCALE);
$empties = (trim($value) === '' or ($isscale and $value == -1)); $empties = (trim($value ?? '') === '' or ($isscale and $value == -1));
if ($filter == 'all' or $empties) { if ($filter == 'all' or $empties) {
$data->$varname = ($isscale and empty($insertvalue)) ? $data->$varname = ($isscale and empty($insertvalue)) ?

View File

@ -59,7 +59,7 @@ switch ($action) {
// Normalise Moodle language using underscore, as opposed to H5P which uses dash. // Normalise Moodle language using underscore, as opposed to H5P which uses dash.
$language = optional_param('default-language', null, PARAM_RAW); $language = optional_param('default-language', null, PARAM_RAW);
$language = clean_param(str_replace('-', '_', $language), PARAM_LANG); $language = clean_param(str_replace('-', '_', $language ?? ''), PARAM_LANG);
if (!empty($name)) { if (!empty($name)) {
$editor->ajax->action(H5PEditorEndpoints::SINGLE_LIBRARY, $name, $editor->ajax->action(H5PEditorEndpoints::SINGLE_LIBRARY, $name,

View File

@ -163,7 +163,7 @@ class api {
unset($library->major_version); unset($library->major_version);
$library->minorVersion = (int) $library->minorversion; $library->minorVersion = (int) $library->minorversion;
unset($library->minorversion); unset($library->minorversion);
$library->metadataSettings = json_decode($library->metadatasettings); $library->metadataSettings = json_decode($library->metadatasettings ?? '');
// If we already add this library means that it is an old version,as the previous query was sorted by version. // If we already add this library means that it is an old version,as the previous query was sorted by version.
if (isset($added[$library->name])) { if (isset($added[$library->name])) {

View File

@ -274,7 +274,7 @@ class editor_framework implements H5peditorStorage {
if ($details) { if ($details) {
$library->title = $details->title; $library->title = $details->title;
$library->runnable = $details->runnable; $library->runnable = $details->runnable;
$library->metadataSettings = json_decode($details->metadatasettings); $library->metadataSettings = json_decode($details->metadatasettings ?? '');
$library->example = $details->example; $library->example = $details->example;
$library->tutorial = $details->tutorial; $library->tutorial = $details->tutorial;
$librariesin[] = $library; $librariesin[] = $library;

View File

@ -4560,7 +4560,7 @@ function role_get_name(stdClass $role, $context = null, $rolenamedisplay = ROLEN
} }
if ($rolenamedisplay == ROLENAME_ALIAS) { if ($rolenamedisplay == ROLENAME_ALIAS) {
if ($coursecontext and trim($role->coursealias) !== '') { if ($coursecontext and trim($role->coursealias ?? '') !== '') {
return format_string($role->coursealias, true, array('context'=>$coursecontext)); return format_string($role->coursealias, true, array('context'=>$coursecontext));
} else { } else {
return $original; return $original;
@ -4568,7 +4568,7 @@ function role_get_name(stdClass $role, $context = null, $rolenamedisplay = ROLEN
} }
if ($rolenamedisplay == ROLENAME_BOTH) { if ($rolenamedisplay == ROLENAME_BOTH) {
if ($coursecontext and trim($role->coursealias) !== '') { if ($coursecontext and trim($role->coursealias ?? '') !== '') {
return format_string($role->coursealias, true, array('context'=>$coursecontext)) . " ($original)"; return format_string($role->coursealias, true, array('context'=>$coursecontext)) . " ($original)";
} else { } else {
return $original; return $original;

View File

@ -64,7 +64,7 @@ final class FilesystemSkipPassedListLocator implements SpecificationLocator {
* @return SpecificationIterator * @return SpecificationIterator
*/ */
public function locateSpecifications(Suite $suite, $locator) { public function locateSpecifications(Suite $suite, $locator) {
if (!is_file($locator) || 'passed' !== pathinfo($locator, PATHINFO_EXTENSION)) { if (!$locator || !is_file($locator) || 'passed' !== pathinfo($locator, PATHINFO_EXTENSION)) {
return new NoSpecificationsIterator($suite); return new NoSpecificationsIterator($suite);
} }

View File

@ -1004,7 +1004,7 @@ $cache = '.var_export($cache, true).';
return (bool)preg_match('/^[a-z][a-z0-9]*$/', $pluginname); return (bool)preg_match('/^[a-z][a-z0-9]*$/', $pluginname);
} else { } else {
return (bool)preg_match('/^[a-z](?:[a-z0-9_](?!__))*[a-z0-9]+$/', $pluginname); return (bool)preg_match('/^[a-z](?:[a-z0-9_](?!__))*[a-z0-9]+$/', $pluginname ?? '');
} }
} }

View File

@ -319,7 +319,7 @@ class core_date {
if (!defined('PHPUNIT_TEST')) { if (!defined('PHPUNIT_TEST')) {
throw new coding_exception('core_date::phpunit_override_default_php_timezone() must be used only from unit tests'); throw new coding_exception('core_date::phpunit_override_default_php_timezone() must be used only from unit tests');
} }
$result = timezone_open($tz); // This triggers error if $tz invalid. $result = timezone_open($tz ?? ''); // This triggers error if $tz invalid.
if ($result !== false) { if ($result !== false) {
self::$defaultphptimezone = $tz; self::$defaultphptimezone = $tz;
} else { } else {

View File

@ -594,7 +594,7 @@ class pgsql_native_moodle_database extends moodle_database {
} else if (preg_match('/int(\d)/i', $rawcolumn->type, $matches)) { } else if (preg_match('/int(\d)/i', $rawcolumn->type, $matches)) {
$info->type = 'int'; $info->type = 'int';
if (strpos($rawcolumn->adsrc, 'nextval') === 0) { if (strpos($rawcolumn->adsrc ?? '', 'nextval') === 0) {
$info->primary_key = true; $info->primary_key = true;
$info->meta_type = 'R'; $info->meta_type = 'R';
$info->unique = true; $info->unique = true;

View File

@ -260,7 +260,7 @@ class EvalMath {
if (is_null($o2)) return $this->trigger(get_string('unexpectedclosingbracket', 'mathslib')); if (is_null($o2)) return $this->trigger(get_string('unexpectedclosingbracket', 'mathslib'));
else $output[] = $o2; else $output[] = $o2;
} }
if (preg_match('/^('.self::$namepat.')\($/', $stack->last(2), $matches)) { // did we just close a function? if (preg_match('/^('.self::$namepat.')\($/', $stack->last(2) ?? '', $matches)) { // did we just close a function?
$fnn = $matches[1]; // get the function name $fnn = $matches[1]; // get the function name
$arg_count = $stack->pop(); // see how many arguments there were (cleverly stored on the stack, thank you) $arg_count = $stack->pop(); // see how many arguments there were (cleverly stored on the stack, thank you)
$fn = $stack->pop(); $fn = $stack->pop();

View File

@ -13,6 +13,7 @@ Our changes:
* added round, ceil and floor functions. * added round, ceil and floor functions.
* EvalMath::EvalMath() changed to EvalMath::__construct() and there is a new EvalMath::EvalMath * EvalMath::EvalMath() changed to EvalMath::__construct() and there is a new EvalMath::EvalMath
function to maintain backwards compatibility function to maintain backwards compatibility
* Ensure a string is passed to preg_match in EvalMath::nfx.
To see all changes diff against version 1.1, available from: To see all changes diff against version 1.1, available from:
http://www.phpclasses.org/browse/package/2695.html http://www.phpclasses.org/browse/package/2695.html
@ -27,4 +28,4 @@ Changes by Stefan Erlachner, Thomas Niedermaier (MDL-64414):
* add function or: * add function or:
e.g. if (or(condition_1, condition_2, ... condition_n)) e.g. if (or(condition_1, condition_2, ... condition_n))
* add function and: * add function and:
e.g. if (and(condition_1, condition_2, ... condition_n)) e.g. if (and(condition_1, condition_2, ... condition_n))

View File

@ -100,7 +100,7 @@ abstract class file_info {
*/ */
protected function build_search_files_sql($extensions, $prefix = null) { protected function build_search_files_sql($extensions, $prefix = null) {
global $DB; global $DB;
if (strlen($prefix)) { if (strlen($prefix ?? '')) {
$prefix = $prefix.'.'; $prefix = $prefix.'.';
} else { } else {
$prefix = ''; $prefix = '';

View File

@ -518,9 +518,9 @@ function file_rewrite_pluginfile_urls($text, $file, $contextid, $component, $fil
} }
if (!empty($options['reverse'])) { if (!empty($options['reverse'])) {
return str_replace($baseurl, '@@PLUGINFILE@@/', $text); return str_replace($baseurl, '@@PLUGINFILE@@/', $text ?? '');
} else { } else {
return str_replace('@@PLUGINFILE@@/', $baseurl, $text); return str_replace('@@PLUGINFILE@@/', $baseurl, $text ?? '');
} }
} }
@ -785,7 +785,7 @@ function file_get_drafarea_files($draftitemid, $filepath = '/') {
} }
// find the file this draft file was created from and count all references in local // find the file this draft file was created from and count all references in local
// system pointing to that file // system pointing to that file
$source = @unserialize($file->get_source()); $source = @unserialize($file->get_source() ?? '');
if (isset($source->original)) { if (isset($source->original)) {
$item->refcount = $fs->search_references_count($source->original); $item->refcount = $fs->search_references_count($source->original);
} }
@ -905,7 +905,7 @@ function file_get_submitted_draft_itemid($elname) {
* @return stored_file * @return stored_file
*/ */
function file_restore_source_field_from_draft_file($storedfile) { function file_restore_source_field_from_draft_file($storedfile) {
$source = @unserialize($storedfile->get_source()); $source = @unserialize($storedfile->get_source() ?? '');
if (!empty($source)) { if (!empty($source)) {
if (is_object($source)) { if (is_object($source)) {
$restoredsource = $source->source; $restoredsource = $source->source;
@ -1199,7 +1199,7 @@ function file_save_draft_area_files($draftitemid, $contextid, $component, $filea
// Let's check if we can update this file or we need to delete and create. // Let's check if we can update this file or we need to delete and create.
if ($newfile->is_directory()) { if ($newfile->is_directory()) {
// Directories are always ok to just update. // Directories are always ok to just update.
} else if (($source = @unserialize($newfile->get_source())) && isset($source->original)) { } else if (($source = @unserialize($newfile->get_source() ?? '')) && isset($source->original)) {
// File has the 'original' - we need to update the file (it may even have not been changed at all). // File has the 'original' - we need to update the file (it may even have not been changed at all).
$original = file_storage::unpack_reference($source->original); $original = file_storage::unpack_reference($source->original);
if ($original['filename'] !== $oldfile->get_filename() || $original['filepath'] !== $oldfile->get_filepath()) { if ($original['filename'] !== $oldfile->get_filename() || $original['filepath'] !== $oldfile->get_filepath()) {
@ -1235,7 +1235,7 @@ function file_save_draft_area_files($draftitemid, $contextid, $component, $filea
// Field files.source for draftarea files contains serialised object with source and original information. // Field files.source for draftarea files contains serialised object with source and original information.
// We only store the source part of it for non-draft file area. // We only store the source part of it for non-draft file area.
$newsource = $newfile->get_source(); $newsource = $newfile->get_source();
if ($source = @unserialize($newfile->get_source())) { if ($source = @unserialize($newfile->get_source() ?? '')) {
$newsource = $source->source; $newsource = $source->source;
} }
if ($oldfile->get_source() !== $newsource) { if ($oldfile->get_source() !== $newsource) {
@ -1269,7 +1269,7 @@ function file_save_draft_area_files($draftitemid, $contextid, $component, $filea
// the size and subdirectory tests are extra safety only, the UI should prevent it // the size and subdirectory tests are extra safety only, the UI should prevent it
foreach ($newhashes as $file) { foreach ($newhashes as $file) {
$file_record = array('contextid'=>$contextid, 'component'=>$component, 'filearea'=>$filearea, 'itemid'=>$itemid, 'timemodified'=>time()); $file_record = array('contextid'=>$contextid, 'component'=>$component, 'filearea'=>$filearea, 'itemid'=>$itemid, 'timemodified'=>time());
if ($source = @unserialize($file->get_source())) { if ($source = @unserialize($file->get_source() ?? '')) {
// Field files.source for draftarea files contains serialised object with source and original information. // Field files.source for draftarea files contains serialised object with source and original information.
// We only store the source part of it for non-draft file area. // We only store the source part of it for non-draft file area.
$file_record['source'] = $source->source; $file_record['source'] = $source->source;
@ -1478,7 +1478,7 @@ function format_postdata_for_curlcall($postdata) {
$currentdata = urlencode($k); $currentdata = urlencode($k);
format_array_postdata_for_curlcall($v, $currentdata, $data); format_array_postdata_for_curlcall($v, $currentdata, $data);
} else { } else {
$data[] = urlencode($k).'='.urlencode($v); $data[] = urlencode($k).'='.urlencode($v ?? '');
} }
} }
$convertedpostdata = implode('&', $data); $convertedpostdata = implode('&', $data);
@ -1771,7 +1771,7 @@ function mimeinfo($element, $filename) {
$mimeinfo = & get_mimetypes_array(); $mimeinfo = & get_mimetypes_array();
static $iconpostfixes = array(256=>'-256', 128=>'-128', 96=>'-96', 80=>'-80', 72=>'-72', 64=>'-64', 48=>'-48', 32=>'-32', 24=>'-24', 16=>''); static $iconpostfixes = array(256=>'-256', 128=>'-128', 96=>'-96', 80=>'-80', 72=>'-72', 64=>'-64', 48=>'-48', 32=>'-32', 24=>'-24', 16=>'');
$filetype = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); $filetype = strtolower(pathinfo($filename ?? '', PATHINFO_EXTENSION));
if (empty($filetype)) { if (empty($filetype)) {
$filetype = 'xxx'; // file without extension $filetype = 'xxx'; // file without extension
} }
@ -2028,8 +2028,8 @@ function get_mimetype_description($obj, $capitalise=false) {
} }
// MIME types may include + symbol but this is not permitted in string ids. // MIME types may include + symbol but this is not permitted in string ids.
$safemimetype = str_replace('+', '_', $mimetype); $safemimetype = str_replace('+', '_', $mimetype ?? '');
$safemimetypestr = str_replace('+', '_', $mimetypestr); $safemimetypestr = str_replace('+', '_', $mimetypestr ?? '');
$customdescription = mimeinfo('customdescription', $filename); $customdescription = mimeinfo('customdescription', $filename);
if ($customdescription) { if ($customdescription) {
// Call format_string on the custom description so that multilang // Call format_string on the custom description so that multilang
@ -2919,7 +2919,7 @@ function file_overwrite_existing_draftfile(stored_file $newfile, stored_file $ex
$fs = get_file_storage(); $fs = get_file_storage();
// Remember original file source field. // Remember original file source field.
$source = @unserialize($existingfile->get_source()); $source = @unserialize($existingfile->get_source() ?? '');
// Remember the original sortorder. // Remember the original sortorder.
$sortorder = $existingfile->get_sortorder(); $sortorder = $existingfile->get_sortorder();
if ($newfile->is_external_file()) { if ($newfile->is_external_file()) {
@ -2943,7 +2943,7 @@ function file_overwrite_existing_draftfile(stored_file $newfile, stored_file $ex
$newfile = $fs->create_file_from_storedfile($newfilerecord, $newfile); $newfile = $fs->create_file_from_storedfile($newfilerecord, $newfile);
// Preserve original file location (stored in source field) for handling references. // Preserve original file location (stored in source field) for handling references.
if (isset($source->original)) { if (isset($source->original)) {
if (!($newfilesource = @unserialize($newfile->get_source()))) { if (!($newfilesource = @unserialize($newfile->get_source() ?? ''))) {
$newfilesource = new stdClass(); $newfilesource = new stdClass();
} }
$newfilesource->original = $source->original; $newfilesource->original = $source->original;

View File

@ -1800,7 +1800,7 @@ class file_storage {
// the latter of which can go to 100, we need to make sure that quality here is // the latter of which can go to 100, we need to make sure that quality here is
// in a safe range or PHP WILL CRASH AND DIE. You have been warned. // in a safe range or PHP WILL CRASH AND DIE. You have been warned.
$quality = $quality > 9 ? (int)(max(1.0, (float)$quality / 100.0) * 9.0) : $quality; $quality = $quality > 9 ? (int)(max(1.0, (float)$quality / 100.0) * 9.0) : $quality;
imagepng($img, NULL, $quality, NULL); imagepng($img, NULL, $quality, PNG_NO_FILTER);
break; break;
default: default:
@ -2462,6 +2462,6 @@ class file_storage {
* @return string The file's content hash * @return string The file's content hash
*/ */
public static function hash_from_string($content) { public static function hash_from_string($content) {
return sha1($content); return sha1($content ?? '');
} }
} }

View File

@ -426,7 +426,7 @@ class file_system_filedir extends file_system {
$contenthash = file_storage::hash_from_string($content); $contenthash = file_storage::hash_from_string($content);
// Binary length. // Binary length.
$filesize = strlen($content); $filesize = strlen($content ?? '');
$hashpath = $this->get_fulldir_from_hash($contenthash); $hashpath = $this->get_fulldir_from_hash($contenthash);
$hashfile = $this->get_local_path_from_hash($contenthash, false); $hashfile = $this->get_local_path_from_hash($contenthash, false);

View File

@ -493,7 +493,7 @@ class tgz_extractor {
unlink($this->currentfile); unlink($this->currentfile);
} else { } else {
// For index file, get number of files and delete temp file. // For index file, get number of files and delete temp file.
$contents = file_get_contents($this->currentfile, null, null, null, 128); $contents = file_get_contents($this->currentfile, false, null, 0, 128);
$matches = array(); $matches = array();
if (preg_match('~^' . preg_quote(tgz_packer::ARCHIVE_INDEX_COUNT_PREFIX) . if (preg_match('~^' . preg_quote(tgz_packer::ARCHIVE_INDEX_COUNT_PREFIX) .
'([0-9]+)~', $contents, $matches)) { '([0-9]+)~', $contents, $matches)) {

View File

@ -62,7 +62,7 @@ class filetypes_util {
*/ */
public function normalize_file_types($types) { public function normalize_file_types($types) {
if ($types === '') { if ($types === '' || $types === null) {
return []; return [];
} }

View File

@ -86,7 +86,7 @@ class MoodleQuickForm_passwordunmask extends MoodleQuickForm_password {
*/ */
public function export_for_template(renderer_base $output) { public function export_for_template(renderer_base $output) {
$context = parent::export_for_template($output); $context = parent::export_for_template($output);
$context['valuechars'] = array_fill(0, strlen($context['value']), 'x'); $context['valuechars'] = array_fill(0, strlen($context['value'] ?? ''), 'x');
return $context; return $context;
} }

View File

@ -3261,7 +3261,7 @@ class MoodleQuickForm_Renderer extends HTML_QuickForm_Renderer_Tableless{
$html = str_replace('{type}', $element->getType(), $html); $html = str_replace('{type}', $element->getType(), $html);
$html = str_replace('{name}', $element->getName(), $html); $html = str_replace('{name}', $element->getName(), $html);
$html = str_replace('{groupname}', '', $html); $html = str_replace('{groupname}', '', $html);
$html = str_replace('{class}', $element->getAttribute('class'), $html); $html = str_replace('{class}', $element->getAttribute('class') ?? '', $html);
$emptylabel = ''; $emptylabel = '';
if ($element->getLabel() == '') { if ($element->getLabel() == '') {
$emptylabel = 'femptylabel'; $emptylabel = 'femptylabel';

View File

@ -52,7 +52,7 @@ class core_html2text extends \Html2Text\Html2Text {
*/ */
function __construct($html = '', $options = array()) { function __construct($html = '', $options = array()) {
// Call the parent constructor. // Call the parent constructor.
parent::__construct($html, $options); parent::__construct($html ?? '', $options);
// MDL-27736: Trailing spaces before newline or tab. // MDL-27736: Trailing spaces before newline or tab.
$this->entSearch[] = '/[ ]+([\n\t])/'; $this->entSearch[] = '/[ ]+([\n\t])/';

View File

@ -123,7 +123,7 @@ class calc_formula {
* @return string localised formula * @return string localised formula
*/ */
public static function localize($formula) { public static function localize($formula) {
$formula = str_replace('.', '$', $formula); // temp placeholder $formula = str_replace('.', '$', $formula ?? ''); // temp placeholder
$formula = str_replace(',', get_string('listsep', 'langconfig'), $formula); $formula = str_replace(',', get_string('listsep', 'langconfig'), $formula);
$formula = str_replace('$', get_string('decsep', 'langconfig'), $formula); $formula = str_replace('$', get_string('decsep', 'langconfig'), $formula);
return $formula; return $formula;

View File

@ -5836,7 +5836,7 @@ class navigation_json {
} }
if ($child->forcetitle || $child->title !== $child->text) { if ($child->forcetitle || $child->title !== $child->text) {
$attributes['title'] = htmlentities($child->title, ENT_QUOTES, 'UTF-8'); $attributes['title'] = htmlentities($child->title ?? '', ENT_QUOTES, 'UTF-8');
} }
if (array_key_exists($child->key.':'.$child->type, $this->expandable)) { if (array_key_exists($child->key.':'.$child->type, $this->expandable)) {
$attributes['expandable'] = $child->key; $attributes['expandable'] = $child->key;

View File

@ -2352,7 +2352,7 @@ class html_writer {
if (!is_null($for)) { if (!is_null($for)) {
$attributes = array_merge($attributes, array('for' => $for)); $attributes = array_merge($attributes, array('for' => $for));
} }
$text = trim($text); $text = trim($text ?? '');
$label = self::tag('label', $text, $attributes); $label = self::tag('label', $text, $attributes);
// TODO MDL-12192 $colonize disabled for now yet // TODO MDL-12192 $colonize disabled for now yet

View File

@ -1854,7 +1854,7 @@ class theme_config {
// Now resolve all theme settings or do any other postprocessing. // Now resolve all theme settings or do any other postprocessing.
// This needs to be done before calling core parser, since the parser strips [[settings]] tags. // This needs to be done before calling core parser, since the parser strips [[settings]] tags.
$csspostprocess = $this->csspostprocess; $csspostprocess = $this->csspostprocess;
if (function_exists($csspostprocess)) { if ($csspostprocess && function_exists($csspostprocess)) {
$css = $csspostprocess($css, $this); $css = $csspostprocess($css, $this);
} }

View File

@ -634,6 +634,7 @@ function get_docs_url($path = null) {
$path = ''; $path = '';
} }
$path = $path ?? '';
// Absolute URLs are used unmodified. // Absolute URLs are used unmodified.
if (substr($path, 0, 7) === 'http://' || substr($path, 0, 8) === 'https://') { if (substr($path, 0, 7) === 'http://' || substr($path, 0, 8) === 'https://') {
return $path; return $path;

View File

@ -1463,7 +1463,7 @@ class flexible_table {
// Load any existing user preferences. // Load any existing user preferences.
if ($this->persistent) { if ($this->persistent) {
$this->prefs = json_decode(get_user_preferences('flextable_' . $this->uniqueid), true); $this->prefs = json_decode(get_user_preferences('flextable_' . $this->uniqueid) ?? '', true);
$oldprefs = $this->prefs; $oldprefs = $this->prefs;
} else if (isset($SESSION->flextable[$this->uniqueid])) { } else if (isset($SESSION->flextable[$this->uniqueid])) {
$this->prefs = $SESSION->flextable[$this->uniqueid]; $this->prefs = $SESSION->flextable[$this->uniqueid];

View File

@ -131,7 +131,7 @@ return (() => {
EOF; EOF;
for ($i = 0; $i < self::get_extended_timeout() * 10; $i++) { for ($i = 0; $i < self::get_extended_timeout() * 10; $i++) {
$results = json_decode($this->evaluate_script($getresults)); $results = json_decode($this->evaluate_script($getresults) ?? '');
if ($results) { if ($results) {
break; break;
} }

View File

@ -97,7 +97,7 @@ function s($var) {
} }
return preg_replace('/&amp;#(\d+|x[0-9a-f]+);/i', '&#$1;', return preg_replace('/&amp;#(\d+|x[0-9a-f]+);/i', '&#$1;',
htmlspecialchars($var, ENT_QUOTES | ENT_HTML401 | ENT_SUBSTITUTE)); htmlspecialchars($var ?? '', ENT_QUOTES | ENT_HTML401 | ENT_SUBSTITUTE));
} }
/** /**
@ -149,7 +149,7 @@ function addslashes_js($var) {
*/ */
function strip_querystring($url) { function strip_querystring($url) {
if ($commapos = strpos($url, '?')) { if ($commapos = strpos($url ?? '', '?')) {
return substr($url, 0, $commapos); return substr($url, 0, $commapos);
} else { } else {
return $url; return $url;
@ -336,6 +336,7 @@ class moodle_url {
$this->anchor = $url->anchor; $this->anchor = $url->anchor;
} else { } else {
$url = $url ?? '';
// Detect if anchor used. // Detect if anchor used.
$apos = strpos($url, '#'); $apos = strpos($url, '#');
if ($apos !== false) { if ($apos !== false) {
@ -1127,7 +1128,7 @@ function validate_email($address) {
require_once("{$CFG->libdir}/phpmailer/moodle_phpmailer.php"); require_once("{$CFG->libdir}/phpmailer/moodle_phpmailer.php");
return moodle_phpmailer::validateAddress($address) && !preg_match('/[<>]/', $address); return moodle_phpmailer::validateAddress($address ?? '') && !preg_match('/[<>]/', $address);
} }
/** /**
@ -1540,7 +1541,7 @@ function format_string($string, $striplinks = true, $options = null) {
* @return string * @return string
*/ */
function replace_ampersands_not_followed_by_entity($string) { function replace_ampersands_not_followed_by_entity($string) {
return preg_replace("/\&(?![a-zA-Z0-9#]{1,8};)/", "&amp;", $string); return preg_replace("/\&(?![a-zA-Z0-9#]{1,8};)/", "&amp;", $string ?? '');
} }
/** /**

View File

@ -63,7 +63,7 @@ class media_youtube_plugin extends core_media_player_external {
protected function embed_external(moodle_url $url, $name, $width, $height, $options) { protected function embed_external(moodle_url $url, $name, $width, $height, $options) {
$info = trim($name); $info = trim($name ?? '');
if (empty($info) or strpos($info, 'http') === 0) { if (empty($info) or strpos($info, 'http') === 0) {
$info = get_string('pluginname', 'media_youtube'); $info = get_string('pluginname', 'media_youtube');
} }
@ -125,7 +125,7 @@ OET;
if (is_numeric($rawtime)) { if (is_numeric($rawtime)) {
// Start time already specified as a number of seconds; ensure it's an integer. // Start time already specified as a number of seconds; ensure it's an integer.
$seconds = $rawtime; $seconds = $rawtime;
} else if (preg_match('/(\d+?h)?(\d+?m)?(\d+?s)?/i', $rawtime, $matches)) { } else if (preg_match('/(\d+?h)?(\d+?m)?(\d+?s)?/i', $rawtime ?? '', $matches)) {
// Convert into a raw number of seconds, as that's all embedded players accept. // Convert into a raw number of seconds, as that's all embedded players accept.
for ($i = 1; $i < count($matches); $i++) { for ($i = 1; $i < count($matches); $i++) {
if (empty($matches[$i])) { if (empty($matches[$i])) {

View File

@ -310,7 +310,7 @@ class preset {
$instance = $this->manager->get_instance(); $instance = $this->manager->get_instance();
foreach (manager::TEMPLATES_LIST as $templatename => $templatefilename) { foreach (manager::TEMPLATES_LIST as $templatename => $templatefilename) {
$templatefile = fopen("$exportdir/$templatefilename", 'w'); $templatefile = fopen("$exportdir/$templatefilename", 'w');
fwrite($templatefile, $instance->{$templatename}); fwrite($templatefile, $instance->{$templatename} ?? '');
fclose($templatefile); fclose($templatefile);
} }
@ -710,7 +710,7 @@ class preset {
$presetxmldata = "<preset>\n\n"; $presetxmldata = "<preset>\n\n";
// Add description. // Add description.
$presetxmldata .= '<description>' . htmlspecialchars($this->description, ENT_COMPAT) . "</description>\n\n"; $presetxmldata .= '<description>' . htmlspecialchars($this->description ?? '', ENT_COMPAT) . "</description>\n\n";
// Add settings. // Add settings.
// Raw settings are not preprocessed during saving of presets. // Raw settings are not preprocessed during saving of presets.

View File

@ -304,7 +304,7 @@ class entry extends \core_search\base_mod {
continue; continue;
} }
$content->priority = $classname::get_priority(); $content->priority = $classname::get_priority();
$content->addtemplateposition = strpos($template, '[['.$content->fldname.']]'); $content->addtemplateposition = strpos($template ?? '', '[['.$content->fldname.']]');
} }
$orderqueue = new \SPLPriorityQueue(); $orderqueue = new \SPLPriorityQueue();

View File

@ -170,11 +170,11 @@ class data_field_latlong extends data_field_base {
} }
$lat = $content->content; $lat = $content->content;
if (strlen($lat) < 1) { if (strlen($lat ?? '') < 1) {
return ''; return '';
} }
$long = $content->content1; $long = $content->content1;
if (strlen($long) < 1) { if (strlen($long ?? '') < 1) {
return ''; return '';
} }
// We use format_float to display in the regional format. // We use format_float to display in the regional format.
@ -254,7 +254,7 @@ class data_field_latlong extends data_field_base {
// When updating these values (which might be region formatted) we should format // When updating these values (which might be region formatted) we should format
// the float to allow for a consistent float format in the database. // the float to allow for a consistent float format in the database.
$value = unformat_float($value); $value = unformat_float($value);
$value = trim($value); $value = trim($value ?? '');
if (strlen($value) > 0) { if (strlen($value) > 0) {
$value = floatval($value); $value = floatval($value);
} else { } else {

View File

@ -68,7 +68,7 @@ class data_field_number extends data_field_base {
return ''; return '';
} }
$number = $content->content; $number = $content->content;
$decimals = trim($this->field->param1); $decimals = trim($this->field->param1 ?? '');
// Only apply number formatting if param1 contains an integer number >= 0. // Only apply number formatting if param1 contains an integer number >= 0.
if (preg_match("/^\d+$/", $decimals)) { if (preg_match("/^\d+$/", $decimals)) {
$decimals = $decimals * 1; $decimals = $decimals * 1;

View File

@ -840,19 +840,19 @@ function data_replace_field_in_templates($data, $searchfieldname, $newfieldname)
$newdata = new stdClass(); $newdata = new stdClass();
$newdata->id = $data->id; $newdata->id = $data->id;
$newdata->singletemplate = str_ireplace('[['.$searchfieldname.']]', $newdata->singletemplate = str_ireplace('[['.$searchfieldname.']]',
$prestring.$newfieldname.$poststring, $data->singletemplate); $prestring.$newfieldname.$poststring, $data->singletemplate ?? '');
$newdata->listtemplate = str_ireplace('[['.$searchfieldname.']]', $newdata->listtemplate = str_ireplace('[['.$searchfieldname.']]',
$prestring.$newfieldname.$poststring, $data->listtemplate); $prestring.$newfieldname.$poststring, $data->listtemplate ?? '');
$newdata->addtemplate = str_ireplace('[['.$searchfieldname.']]', $newdata->addtemplate = str_ireplace('[['.$searchfieldname.']]',
$prestring.$newfieldname.$poststring, $data->addtemplate); $prestring.$newfieldname.$poststring, $data->addtemplate ?? '');
$newdata->addtemplate = str_ireplace('[['.$searchfieldname.'#id]]', $newdata->addtemplate = str_ireplace('[['.$searchfieldname.'#id]]',
$prestring.$newfieldname.$idpart.$poststring, $data->addtemplate); $prestring.$newfieldname.$idpart.$poststring, $data->addtemplate ?? '');
$newdata->rsstemplate = str_ireplace('[['.$searchfieldname.']]', $newdata->rsstemplate = str_ireplace('[['.$searchfieldname.']]',
$prestring.$newfieldname.$poststring, $data->rsstemplate); $prestring.$newfieldname.$poststring, $data->rsstemplate ?? '');
return $DB->update_record('data', $newdata); return $DB->update_record('data', $newdata);
} }

View File

@ -83,7 +83,7 @@ class handler extends handler_base {
// H5P add some extra params to ID to define subcontents. // H5P add some extra params to ID to define subcontents.
$parts = explode('?', $xapiobject, 2); $parts = explode('?', $xapiobject, 2);
$contextid = array_shift($parts); $contextid = array_shift($parts);
$subcontent = str_replace('subContentId=', '', array_shift($parts)); $subcontent = str_replace('subContentId=', '', array_shift($parts) ?? '');
if (empty($contextid) || !is_numeric($contextid)) { if (empty($contextid) || !is_numeric($contextid)) {
return null; return null;
} }

View File

@ -318,7 +318,7 @@ function mod_lti_get_all_content_items(\core_course\local\entity\content_item $d
$type->name = 'lti_type_' . $ltitype->id; $type->name = 'lti_type_' . $ltitype->id;
// Clean the name. We don't want tags here. // Clean the name. We don't want tags here.
$type->title = clean_param($ltitype->name, PARAM_NOTAGS); $type->title = clean_param($ltitype->name, PARAM_NOTAGS);
$trimmeddescription = trim($ltitype->description); $trimmeddescription = trim($ltitype->description ?? '');
$type->help = ''; $type->help = '';
if ($trimmeddescription != '') { if ($trimmeddescription != '') {
// Clean the description. We don't want tags here. // Clean the description. We don't want tags here.

View File

@ -2437,7 +2437,7 @@ function lti_get_configured_types($courseid, $sectionreturn = 0) {
$type->name = 'lti_type_' . $ltitype->id; $type->name = 'lti_type_' . $ltitype->id;
// Clean the name. We don't want tags here. // Clean the name. We don't want tags here.
$type->title = clean_param($ltitype->name, PARAM_NOTAGS); $type->title = clean_param($ltitype->name, PARAM_NOTAGS);
$trimmeddescription = trim($ltitype->description); $trimmeddescription = trim($ltitype->description ?? '');
if ($trimmeddescription != '') { if ($trimmeddescription != '') {
// Clean the description. We don't want tags here. // Clean the description. We don't want tags here.
$type->help = clean_param($trimmeddescription, PARAM_NOTAGS); $type->help = clean_param($trimmeddescription, PARAM_NOTAGS);
@ -2454,7 +2454,7 @@ function lti_get_configured_types($courseid, $sectionreturn = 0) {
function lti_get_domain_from_url($url) { function lti_get_domain_from_url($url) {
$matches = array(); $matches = array();
if (preg_match(LTI_URL_DOMAIN_REGEX, $url, $matches)) { if (preg_match(LTI_URL_DOMAIN_REGEX, $url ?? '', $matches)) {
return $matches[1]; return $matches[1];
} }
} }

View File

@ -662,7 +662,7 @@ class seb_quiz_settings extends persistent {
* @return array of string, the separate keys. * @return array of string, the separate keys.
*/ */
private function split_keys($keys) : array { private function split_keys($keys) : array {
$keys = preg_split('~[ \t\n\r,;]+~', $keys, -1, PREG_SPLIT_NO_EMPTY); $keys = preg_split('~[ \t\n\r,;]+~', $keys ?? '', -1, PREG_SPLIT_NO_EMPTY);
foreach ($keys as $i => $key) { foreach ($keys as $i => $key) {
$keys[$i] = strtolower($key); $keys[$i] = strtolower($key);
} }

View File

@ -227,7 +227,7 @@ class provider implements
'options' => $record->qoptions 'options' => $record->qoptions
]); ]);
$qtype = $record->qtype; $qtype = $record->qtype;
$options = explode(',', $q->options); $options = explode(',', $q->options ?? '');
$carry[] = [ $carry[] = [
'question' => array_merge((array) $q, [ 'question' => array_merge((array) $q, [

View File

@ -342,7 +342,7 @@ class mod_workshop_portfolio_caller extends portfolio_module_caller_base {
} }
if ($this->workshop->overallfeedbackmode) { if ($this->workshop->overallfeedbackmode) {
if ($assessment->feedbackauthorattachment or trim($assessment->feedbackauthor) !== '') { if ($assessment->feedbackauthorattachment or trim($assessment->feedbackauthor ?? '') !== '') {
$output .= html_writer::tag('h3', get_string('overallfeedback', 'mod_workshop')); $output .= html_writer::tag('h3', get_string('overallfeedback', 'mod_workshop'));
$content = $this->format_exported_text($assessment->feedbackauthor, $assessment->feedbackauthorformat); $content = $this->format_exported_text($assessment->feedbackauthor, $assessment->feedbackauthorformat);
$content = portfolio_rewrite_pluginfile_urls($content, $this->workshop->context->id, 'mod_workshop', $content = portfolio_rewrite_pluginfile_urls($content, $this->workshop->context->id, 'mod_workshop',

View File

@ -179,7 +179,7 @@ class moodle_content_writer implements content_writer {
$returnstring = $path . DIRECTORY_SEPARATOR . $this->get_files_target_url($component, $filearea, $itemid) . '/'; $returnstring = $path . DIRECTORY_SEPARATOR . $this->get_files_target_url($component, $filearea, $itemid) . '/';
$returnstring = clean_param($returnstring, PARAM_PATH); $returnstring = clean_param($returnstring, PARAM_PATH);
return str_replace('@@PLUGINFILE@@/', $returnstring, $text); return str_replace('@@PLUGINFILE@@/', $returnstring, $text ?? '');
} }
/** /**

View File

@ -382,7 +382,7 @@ class content_writer implements \core_privacy\local\request\content_writer {
* @return string The processed string * @return string The processed string
*/ */
public function rewrite_pluginfile_urls(array $subcontext, $component, $filearea, $itemid, $text) : string { public function rewrite_pluginfile_urls(array $subcontext, $component, $filearea, $itemid, $text) : string {
return str_replace('@@PLUGINFILE@@/', 'files/', $text); return str_replace('@@PLUGINFILE@@/', 'files/', $text ?? '');
} }
/** /**

View File

@ -149,7 +149,7 @@ class core_question_renderer extends plugin_renderer_base {
* @return HTML fragment. * @return HTML fragment.
*/ */
protected function number($number) { protected function number($number) {
if (trim($number) === '') { if (trim($number ?? '') === '') {
return ''; return '';
} }
$numbertext = ''; $numbertext = '';

View File

@ -270,7 +270,7 @@ class qtype_calculated_qe2_attempt_updater extends question_qtype_attempt_update
* corresponding value. * corresponding value.
*/ */
protected function substitute_values_for_eval($expression) { protected function substitute_values_for_eval($expression) {
return str_replace($this->search, $this->safevalue, $expression); return str_replace($this->search ?? '', $this->safevalue ?? '', $expression ?? '');
} }
/** /**
@ -282,7 +282,7 @@ class qtype_calculated_qe2_attempt_updater extends question_qtype_attempt_update
* corresponding value. * corresponding value.
*/ */
protected function substitute_values_pretty($text) { protected function substitute_values_pretty($text) {
return str_replace($this->search, $this->prettyvalue, $text); return str_replace($this->search ?? '', $this->prettyvalue ?? '', $text ?? '');
} }
/** /**
@ -296,7 +296,7 @@ class qtype_calculated_qe2_attempt_updater extends question_qtype_attempt_update
$text = preg_replace_callback('~\{=([^{}]*(?:\{[^{}]+}[^{}]*)*)}~', $text = preg_replace_callback('~\{=([^{}]*(?:\{[^{}]+}[^{}]*)*)}~',
function ($matches) use ($vs, $format, $length) { function ($matches) use ($vs, $format, $length) {
return $vs->format_float($vs->calculate($matches[1]), $length, $format); return $vs->format_float($vs->calculate($matches[1]), $length, $format);
}, $text); }, $text ?? '');
return $this->substitute_values_pretty($text); return $this->substitute_values_pretty($text);
} }
} }

View File

@ -294,7 +294,7 @@ class qtype_calculatedmulti_qe2_attempt_updater extends question_qtype_attempt_u
* corresponding value. * corresponding value.
*/ */
protected function substitute_values_for_eval($expression) { protected function substitute_values_for_eval($expression) {
return str_replace($this->search, $this->safevalue, $expression); return str_replace($this->search ?? '', $this->safevalue ?? '', $expression ?? '');
} }
/** /**
@ -306,7 +306,7 @@ class qtype_calculatedmulti_qe2_attempt_updater extends question_qtype_attempt_u
* corresponding value. * corresponding value.
*/ */
protected function substitute_values_pretty($text) { protected function substitute_values_pretty($text) {
return str_replace($this->search, $this->prettyvalue, $text); return str_replace($this->search ?? '', $this->prettyvalue ?? '', $text ?? '');
} }
/** /**
@ -320,7 +320,7 @@ class qtype_calculatedmulti_qe2_attempt_updater extends question_qtype_attempt_u
$text = preg_replace_callback(qtype_calculated::FORMULAS_IN_TEXT_REGEX, $text = preg_replace_callback(qtype_calculated::FORMULAS_IN_TEXT_REGEX,
function ($matches) use ($vs, $format, $length) { function ($matches) use ($vs, $format, $length) {
return $vs->format_float($vs->calculate($matches[1]), $length, $format); return $vs->format_float($vs->calculate($matches[1]), $length, $format);
}, $text); }, $text ?? '');
return $this->substitute_values_pretty($text); return $this->substitute_values_pretty($text);
} }
} }

View File

@ -235,7 +235,7 @@ class qtype_multianswer_textfield_renderer extends qtype_multianswer_subq_render
} }
// Work out a good input field size. // Work out a good input field size.
$size = max(1, core_text::strlen(trim($response)) + 1); $size = max(1, core_text::strlen(trim($response ?? '')) + 1);
foreach ($subq->answers as $ans) { foreach ($subq->answers as $ans) {
$size = max($size, core_text::strlen(trim($ans->answer))); $size = max($size, core_text::strlen(trim($ans->answer)));
} }

View File

@ -653,7 +653,7 @@ class qtype_numerical_answer_processor {
public function apply_units($response, $separateunit = null) { public function apply_units($response, $separateunit = null) {
// Strip spaces (which may be thousands separators) and change other forms // Strip spaces (which may be thousands separators) and change other forms
// of writing e to e. // of writing e to e.
$response = str_replace(' ', '', $response); $response = str_replace(' ', '', $response ?? '');
$response = preg_replace('~(?:e|E|(?:x|\*|×)10(?:\^|\*\*))([+-]?\d+)~', 'e$1', $response); $response = preg_replace('~(?:e|E|(?:x|\*|×)10(?:\^|\*\*))([+-]?\d+)~', 'e$1', $response);
// If a . is present or there are multiple , (i.e. 2,456,789 ) assume , // If a . is present or there are multiple , (i.e. 2,456,789 ) assume ,