Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:125497 X-Original-To: internals@lists.php.net Delivered-To: internals@lists.php.net Received: from php-smtp4.php.net (php-smtp4.php.net [45.112.84.5]) by qa.php.net (Postfix) with ESMTPS id D88FE1A00BD for ; Wed, 11 Sep 2024 01:50:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=php.net; s=mail; t=1726019559; bh=LtvJWrebO3lrYi9O4H5EneOqAmhsrzwPI4IqBaGbI5E=; h=From:Subject:Date:To:From; b=b+LTdqdHFxrmcBUr4kk91aulMnpf1HGhnr5bRtILoys47IAv8iL2MK21sif5jG9MA Ejs7kbV0NKNmzUUlrWJZ6zCXBzC+/DT6LeLlo1S+ADmBo7q3o/9m9gXq4dzbz3FNOj uk+e0AuTsdi10SfaXPU/LzNwDK5pSlYAcFTulRwCm4jGTu1mFErXBZHxwjP1DqXBdT 8eNmcWphX85Fr7sq1uXiYpSampeeJ1hFHQq6P49r2jAc2xnhXCKWwjWw8w8XulC76k Er8sxnus/S3izADDRwDVkwtUlGg5o86JDGD7dXd70llDvSiJiWoTSuqJrX+DnCHNyy VQMA3x8XV6Ibg== Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 1D7C0180053 for ; Wed, 11 Sep 2024 01:52:39 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.0 (2022-12-13) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_50,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,DMARC_PASS,FREEMAIL_FROM, HTML_FONT_FACE_BAD,HTML_MESSAGE,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=4.0.0 X-Spam-Virus: No X-Envelope-From: Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.169]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Wed, 11 Sep 2024 01:52:38 +0000 (UTC) Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-20551e2f1f8so62228485ad.2 for ; Tue, 10 Sep 2024 18:50:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1726019436; x=1726624236; darn=lists.php.net; h=to:date:message-id:subject:mime-version:from:from:to:cc:subject :date:message-id:reply-to; bh=lRNhZYBOSK5lg2dapXO+FZZiweV76kKBoMrrnb7zKYk=; b=Qa+GF6fvqbZf4QuoIlayXvnwEowpN7BY2Eu0DDzvORgy4hRTynbcST5pfHnopTKkb8 TBnQ6ikUowIe2KZSLTA7hnF3Q1Yg1pjUOU/u1NXqO8/oVrhFzwN3Q7LqaUPNySRB3clq YgfD8jgXUve+zeyRvNwyYAM0T/LQZof8oCb4bKn4lyGyfjXRHAghWJp/b3LqBVO7pWca FgW5HaJaW+DPx9kDrSSfTVVehFWjNxxtkh1JEDwwvMpIBBVe/WHoxraNIWF4mJrxKflD VVUBhTmg0NsjERyCxilgfcuJKx/qjVtbiTvTRvxb6EG64jtXWtBgoZQDWIbNIG4xzh9o ByGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1726019436; x=1726624236; h=to:date:message-id:subject:mime-version:from:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=lRNhZYBOSK5lg2dapXO+FZZiweV76kKBoMrrnb7zKYk=; b=B2XuWDoaWr4myQLFVLWPrwtI/WGR8C4M922zeVT99yFgtKY7BPMkAyLvqKjJaRG+JK MkKPCZcO7QNlrxCtMBPilZSaUwsCDDaeWHRCp+QfX9prVQK+dQxEB54OmmwinJ78v5IP FKgqhKV9BA3SOLJIuvCJ+/kOewk9DQPcMYFv4Vmo3tPWrECHSe2dZCEG1xf7IQmg1Asq 5u6smbX2yslRmyzsU3SvANNN8uS6QhudBupPg00McYcxGLUIlAtFxh5NRIf/qee6z9F9 gfZHRAUiEjEH/6O32YfqzlTaSC+jbr20YvbTnVO1ycmpT1EoAsFwmh38Od3EhxUVGWnI h8HA== X-Gm-Message-State: AOJu0YxJJUTFkpWw9a/ZBHF0ryVTrVk0fn2NA8HSeUDPF0GJMEbsCAI/ Y8amzva8UKMmcZ5ng+xYxrU/AeBRZCeiN8ev2dOS1lkjHbJy0tVz7a5Y+w== X-Google-Smtp-Source: AGHT+IH69gcJFIgNsr1CR1TAu3oN9cVVMzjolGfw6QP1Z4w9Tytc788rjCBlC1owbJcW4ozwnh6y4w== X-Received: by 2002:a17:902:ce11:b0:206:c486:4c33 with SMTP id d9443c01a7336-2074c631b1amr40440155ad.30.1726019435801; Tue, 10 Sep 2024 18:50:35 -0700 (PDT) Received: from smtpclient.apple ([2605:59c8:6a:210:ece2:c93a:a339:39e]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-20710e339fesm54103955ad.108.2024.09.10.18.50.35 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 10 Sep 2024 18:50:35 -0700 (PDT) Content-Type: multipart/signed; boundary="Apple-Mail=_4D989BF5-FEA8-4E8F-A941-82A4FD38F0E8"; protocol="application/pkcs7-signature"; micalg=sha-256 Precedence: bulk list-help: list-post: List-Id: internals.lists.php.net x-ms-reactions: disallow Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3776.700.51\)) Subject: [PHP-DEV] Proposal for New Feature: Multi-level Directory Navigation Function Message-ID: <67337073-F5EE-4432-AC61-2A4CC086E12B@gmail.com> Date: Tue, 10 Sep 2024 18:50:24 -0700 To: internals@lists.php.net X-Mailer: Apple Mail (2.3776.700.51) From: danielbaldwin@gmail.com (Daniel Baldwin) --Apple-Mail=_4D989BF5-FEA8-4E8F-A941-82A4FD38F0E8 Content-Type: multipart/alternative; boundary="Apple-Mail=_BF97247D-AF75-4097-807B-06E4B02815DD" --Apple-Mail=_BF97247D-AF75-4097-807B-06E4B02815DD Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Hello, I=E2=80=99m a full stack developer and owner of Truecast that lives in = Holley, Oregon, USA.=20 Introduction Navigating up multiple directory levels is a common requirement in PHP = applications, especially when managing paths in complex projects. = Currently, this is achieved by chaining calls to the dirname() function. = This method, while functional, can become cumbersome and less readable = with increasing directory depth. Proposed Feature I propose the introduction of a new function, upDir(), which simplifies = the process of moving up multiple directory levels in a file path. This = function extends the utility of the existing dirname() by allowing a = user to specify the number of directory levels they wish to ascend in a = single function call. Function Prototype: function upDir(int $levels =3D 1, string $path =3D __DIR__): string Function Example: function upDir(int $levels =3D 1, string $path =3D null) { if ($path =3D=3D=3D null)=20 $path =3D __DIR__; =20 for ($i =3D 0; $i < $levels; $i++) $path =3D dirname($path); =20 return $path; } require upDir(4).'/init.php'; Parameters: path: The input path. levels: The number of parent directories to ascend. Return: Returns the path of the parent directory after ascending the specified = levels. Benefits Improved Readability: Reduces the complexity and improves the = readability of the code, making it easier to understand at a glance, = especially when dealing with multiple nested directories. Error Reduction: Decreases the likelihood of errors that can occur from = multiple chained dirname() calls, like miscounting the number of calls = needed. Efficiency: Potentially increases efficiency by reducing the number of = function calls in a script. Potential Issues and Considerations Backward Compatibility: The function would be an addition to the = existing PHP functions and is not expected to affect backward = compatibility. Performance: Initial benchmarks would need to be conducted to compare = its performance against repeated dirname() calls to ensure there are no = significant overheads. Naming and Parameters: Further discussion might be required to finalize = the name of the function and whether additional parameters (such as = handling symbolic links differently) might be necessary. Open Questions Should there be any specific behaviors or exceptions when the number of = levels exceeds the current depth of the path? Is there a significant demand or use case from the community that = justifies the inclusion of this function in the core PHP library? I look forward to feedback from the community to refine this proposal = and gauge interest in moving forward with an RFC. Thanks! Daniel Baldwin Truecast https://www.truecastdesign.com 458-266-8064 =EF=BF=BC --Apple-Mail=_BF97247D-AF75-4097-807B-06E4B02815DD Content-Type: multipart/related; type="text/html"; boundary="Apple-Mail=_3E5E4E84-FAAD-4803-ACBE-794CA21A0C90" --Apple-Mail=_3E5E4E84-FAAD-4803-ACBE-794CA21A0C90 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 Hello,

I=E2=80=99m a full stack = developer and owner of Truecast that lives in Holley, Oregon, = USA. 

Introduction

Navigating = up multiple directory levels is a common requirement in PHP = applications, especially when managing paths in complex projects. = Currently, this is achieved by chaining calls to = the dirname() function. This method, while = functional, can become cumbersome and less readable with increasing = directory depth.

Proposed Feature

I propose the = introduction of a new function, upDir(), which = simplifies the process of moving up multiple directory levels in a file = path. This function extends the utility of the = existing dirname() by allowing a user to specify = the number of directory levels they wish to ascend in a single function = call.

Function Prototype:

function upDir(int $levels =3D 1, = string $path = =3D __DIR__): string

Function Example:

function upDir(int $levels =3D 1, = string $path = =3D null) {  if  ($path =3D=3D=3D null
=    $path =3D __DIR__;  

for ($i =3D 0; $i < = $levels; $i++) $path =3D dirname($path); =20 return $path; } require = upDir(4).'/init.php';

Parameters= :

  • path: The input = path.
  • levels: The number of parent directories to = ascend.

Return:

  • Returns the path = of the parent directory after ascending the specified = levels.

Benefits

  • Improved = Readability: Reduces the complexity and improves the = readability of the code, making it easier to understand at a glance, = especially when dealing with multiple nested = directories.
  • Error Reduction: Decreases the = likelihood of errors that can occur from multiple = chained dirname() calls, like miscounting the = number of calls needed.
  • Efficiency: Potentially = increases efficiency by reducing the number of function calls in a = script.

Potential Issues and = Considerations

  • Backward Compatibility: The = function would be an addition to the existing PHP functions and is not = expected to affect backward = compatibility.
  • Performance: Initial benchmarks = would need to be conducted to compare its performance against = repeated dirname() calls to ensure there are no = significant overheads.
  • Naming and Parameters: = Further discussion might be required to finalize the name of the = function and whether additional parameters (such as handling symbolic = links differently) might be necessary.

Open = Questions

  • Should there be any specific behaviors or = exceptions when the number of levels exceeds the current depth of the = path?
  • Is there a significant demand or use case = from the community that justifies the inclusion of this function in the = core PHP library?

I look forward to feedback from = the community to refine this proposal and gauge interest in moving = forward with an RFC.



Thanks!

Daniel = Baldwin
Truecast
https://www.truecastdesign.com
458-266-8064


3D"BEAEBEF024334753818FA264A31205BC.png"



= --Apple-Mail=_3E5E4E84-FAAD-4803-ACBE-794CA21A0C90 Content-Transfer-Encoding: base64 Content-Disposition: inline; filename=BEAEBEF024334753818FA264A31205BC.png Content-Type: image/png; name=BEAEBEF024334753818FA264A31205BC.png Content-Id: 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 6P94TJc3ZAAAAABJRU5ErkJggg== --Apple-Mail=_3E5E4E84-FAAD-4803-ACBE-794CA21A0C90-- --Apple-Mail=_BF97247D-AF75-4097-807B-06E4B02815DD-- --Apple-Mail=_4D989BF5-FEA8-4E8F-A941-82A4FD38F0E8 Content-Disposition: attachment; filename=smime.p7s Content-Type: application/pkcs7-signature; name=smime.p7s Content-Transfer-Encoding: base64 MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0BBwEAAKCCDSow ggW1MIIDnaADAgECAhAznFGlyGZAMtSieQXlq3UnMA0GCSqGSIb3DQEBCwUAMIGBMQswCQYDVQQG EwJJVDEQMA4GA1UECAwHQmVyZ2FtbzEZMBcGA1UEBwwQUG9udGUgU2FuIFBpZXRybzEXMBUGA1UE CgwOQWN0YWxpcyBTLnAuQS4xLDAqBgNVBAMMI0FjdGFsaXMgQ2xpZW50IEF1dGhlbnRpY2F0aW9u IENBIEczMB4XDTI0MDUyNTA0NTIxOVoXDTI1MDUyNTA0NTIxOVowIjEgMB4GA1UEAwwXZGFuaWVs YmFsZHdpbkBnbWFpbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCOz4fDoqCn HaYZibtIZbhn3Xa0ojGtqFce0pStrQG/O3fF1UIooM3Lp5dYIbviw+uTHyf0CU9dBEmuXqc4XBUI jnwHZl26inAof31RjZoTGX63i/QdTm7CKqJEizR3yo7ppHnWeI8qwncxBWi6mqaALwj2hYc14HLS iT/u0I91Y6nTWoYWEH0Iqlr16nYtgQ5d3c+dW9YmMH4NgvRxyUElXjeG/avNAsx1SiYQfPuK8hrB jSLgNfebrxmEVgncps2XqoLEWdItAHANDGjl9RZz3sBCTOuLk+DuaUKrKPpxZjHWuxhVsy/FvLtQ dzxGPxBt6zJM7AIyeg5oH5mjlMV/AgMBAAGjggGFMIIBgTAMBgNVHRMBAf8EAjAAMB8GA1UdIwQY MBaAFL6XqaqEv4C/EFN9CTL54S4yG893MH4GCCsGAQUFBwEBBHIwcDA7BggrBgEFBQcwAoYvaHR0 cDovL2NhY2VydC5hY3RhbGlzLml0L2NlcnRzL2FjdGFsaXMtYXV0Y2xpZzMwMQYIKwYBBQUHMAGG JWh0dHA6Ly9vY3NwMDkuYWN0YWxpcy5pdC9WQS9BVVRIQ0wtRzMwIgYDVR0RBBswGYEXZGFuaWVs YmFsZHdpbkBnbWFpbC5jb20wFAYDVR0gBA0wCzAJBgdngQwBBQEBMB0GA1UdJQQWMBQGCCsGAQUF BwMCBggrBgEFBQcDBDBIBgNVHR8EQTA/MD2gO6A5hjdodHRwOi8vY3JsMDkuYWN0YWxpcy5pdC9S ZXBvc2l0b3J5L0FVVEhDTC1HMy9nZXRMYXN0Q1JMMB0GA1UdDgQWBBT1wF8lpsXqxJ+pdVgtaAdI ne8ZrjAOBgNVHQ8BAf8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBAHizJ8vFFOfcCVFYVkJqL4oG jR6kqFEcfb2ElvCF/iZ2jUVVc2Uuq9hlWqwhqD19FEMoj4dLcLYgQverv5Ur3b0euBAGuiCsp8KF 2TOmDN/xUAzdMkWHES1rFx5w34RLmXGgsaN8uxefs3yX7mg7J+xd0/MYMM8VMI8qqzZihZfFQRLf 7nGxus30qvjtlxS7R2krIUhZdCv/ZGCui8Dkx7ATPXQVBN2tsk7yumJJQkAkFJ5OGZ7zfzRIHwR0 BtV7P1vdZfUbvoyJCgV8ADaCahPcF4Y1PIYAf5HtiCG2TeGBjf8rGX0TXV9FoEgqIi0UhfCwedBE T6XgAmmljNlCVOFrXrvuzqpxzJgbbyzAXfXo4/qBoacUI+vm/Pas1ByJom4Gi6ck2dml8DL5f1yu zKVDjvrjgWt/JXhpoka7NIZ9A+RHK3Gd1YmXvWX43EleMTkED/KGmn8hjtz20EYtzUR/CzRqdT4C qx2iH/JevVyJVcrzk+2Vak0YtmaZm75sUEIpNqvAumODcqZDZRoDYF165BdNqxuyh3d3z7PQtXnP agbiAbnSV4ASOX0Y+j8AR3W2UYLVliXcPKN1js1nTKVpcxY2NSt3i0g8NUsta63brgLX9qsXWZEg hmTR97YqXYq1beFWBaMIyBktM/3bJ8u/TvLZF9mFLjQVhreV6oJ3MIIHbTCCBVWgAwIBAgIQFxA+ 3j2KHLXKBlGT58pDazANBgkqhkiG9w0BAQsFADBrMQswCQYDVQQGEwJJVDEOMAwGA1UEBwwFTWls YW4xIzAhBgNVBAoMGkFjdGFsaXMgUy5wLkEuLzAzMzU4NTIwOTY3MScwJQYDVQQDDB5BY3RhbGlz IEF1dGhlbnRpY2F0aW9uIFJvb3QgQ0EwHhcNMjAwNzA2MDg0NTQ3WhcNMzAwOTIyMTEyMjAyWjCB gTELMAkGA1UEBhMCSVQxEDAOBgNVBAgMB0JlcmdhbW8xGTAXBgNVBAcMEFBvbnRlIFNhbiBQaWV0 cm8xFzAVBgNVBAoMDkFjdGFsaXMgUy5wLkEuMSwwKgYDVQQDDCNBY3RhbGlzIENsaWVudCBBdXRo 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 MQ8XDTI0MDkxMTAxNTAyNFowLwYJKoZIhvcNAQkEMSIEINjKhvppA9K+wsLK5+Eo+iYmB/Nm6lH/ HVNPGFO6Nv/FMIGnBgkrBgEEAYI3EAQxgZkwgZYwgYExCzAJBgNVBAYTAklUMRAwDgYDVQQIDAdC ZXJnYW1vMRkwFwYDVQQHDBBQb250ZSBTYW4gUGlldHJvMRcwFQYDVQQKDA5BY3RhbGlzIFMucC5B LjEsMCoGA1UEAwwjQWN0YWxpcyBDbGllbnQgQXV0aGVudGljYXRpb24gQ0EgRzMCEDOcUaXIZkAy 1KJ5BeWrdScwgakGCyqGSIb3DQEJEAILMYGZoIGWMIGBMQswCQYDVQQGEwJJVDEQMA4GA1UECAwH QmVyZ2FtbzEZMBcGA1UEBwwQUG9udGUgU2FuIFBpZXRybzEXMBUGA1UECgwOQWN0YWxpcyBTLnAu QS4xLDAqBgNVBAMMI0FjdGFsaXMgQ2xpZW50IEF1dGhlbnRpY2F0aW9uIENBIEczAhAznFGlyGZA MtSieQXlq3UnMA0GCSqGSIb3DQEBCwUABIIBAFWh+r+Z3wp0RdW/rzFFrGUEBfkrBd1rr4sMTPCu 0KF8BoMgtUSi+HhjQJdUXc9KIZFyMlKfhvSxhaqmqYWdaCtwROmGBwNWmJ96gUQfE+pcSThnlRvf EKtEsNfowoty3BfWaWA4b+ZfKtAkL4pFZ2h7m/gJcPp/oX9wpVr+mK2JnGSGR0XO7U/g3eOMohUI QPSjxjcXNTbAkhRxw2eAhnfs0Z7pRp+G6VpNU1b33f4jHaO6pDgMAfUOJ7Zxu2l/meg3yTmOdMif xAql7BQGSp1Hz0yoZNKsEFkbaehFu6gRNUrBKg1E7A/QuDVvP7BVhYn94ig7sqP53YKfWtm4i+sA AAAAAAA= --Apple-Mail=_4D989BF5-FEA8-4E8F-A941-82A4FD38F0E8--